IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

probleme de requete multi table pour exclure des resultats


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut probleme de requete multi table pour exclure des resultats
    Bonjour

    Je dispose d'un intranet pour mon association développé en interne.
    Nous avons trois tables :
    1) la table adherents (clé = adh_id)
    2) la table activites (clé = act_id) (qui reference les activites que nous proposons)
    3) la table inscriptions (qui reference l'inscription d'un adherent à un activité)

    la table inscription contient pour chaque inscription à une activité, un champ contenant l'id de l'adherent et l'id de l'activité correspondante.

    je souhaite faire une requette qui pour un adhérent donné me liste toutes les activités pour lequel cet adhérent n'est pas déjà inscrit et je bloque. mes requettes JOIN semble inadaptées.

    Quelqu'un aurait il la solution ?

    Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 104
    Points
    104
    Par défaut
    Salut


    A priori un bon vieux select devrait suffire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT * FROM
    adherents, activites ,inscriptions 
    WHERE
    adherents.adh_id = inscriptions.adh_id
    AND
    activites.act_id = inscriptions.act_id
    Je sais pas si c vraiment ce que tu veux faire ?
    MMais j''espere que ca t'aidera au moins

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut non resolu
    Cela ne resoud pas le probleme,

    En fait je souhaite que lorsqu'on sélectionne un adhérent (on récupère donc le champ adh_id), on fasse une requette dans la table activités et inscriptions et que la liste des activités s'affiche sauf celles où l'adhérent est déjà inscrit.

    la table inscription contient l'id de l'adhérent et l'id de l'activité.

    Avez vous une piste ?

    Merci

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Yo, check this out:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT activites.*
    FROM adherents, activites
    
    LEFT JOIN inscriptions 
    ON (inscriptions.adh_id = adherents.adh_id AND inscriptions.act_id = activites.act_id)
    
    WHERE adherents.adh_id = '3' AND 
    inscriptions.adh_id IS NULL
    En bleu: ce qu'il faut ajouter pour limiter la requête à un adhérent (fortement conseillé à cause du produit cartésien), dans l'exemple le numéro 3.

  5. #5
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut toujours pas
    Malheuresement cela ne résoud pas le probleme

    Cela affiche les activités pour lesquelles il y a aucune inscription quelque soit l'adhérent or il faut afficher les activités pour lesquelles un adhérent défini n'est pas déjà inscrit.

    Une idée ?

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Essaye ça (optimisé pour un seul adhérent) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT activites.*
    FROM activites
     
    LEFT JOIN inscriptions 
    ON (inscriptions.adh_id = 3 AND inscriptions.act_id = activites.act_id)
     
    WHERE inscriptions.adh_id IS NULL
    Et ne me dit pas que ça ne marche pas parce que j'ai déjà eu l'occasion de tester cette requête sur un cas réel!

    En fait, c'est quasiment le même code que précédemment, mais limité à 1 adhérent particulier et faisant économiser un produit cartésien...

  7. #7
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2004
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 96
    Points : 110
    Points
    110
    Par défaut
    Extrait de la doc MySQL :

    Si aucune ligne ne correspond dans la table de droite dans la partie ON ou USING du LEFT
    JOIN, une ligne avec toutes les colonnes mises à NULL est utilisé en remplacement. Vous
    pouvez utiliser ce fait pour trouver les enregistrements dans une table qui n'ont pas de
    correspondances dans une autre :
    mysql> SELECT table1.* FROM table1
    -> LEFT JOIN table2 ON table1.id=table2.id
    -> WHERE table2.id IS NULL;
    Cet exemple retourne toutes les lignes trouvées dans table1 avec une valeur de id qui n'est
    pas présente dans table2 (autrement dit, toutes les lignes de table1 sans correspondances
    dans la table table2). Cela demande que table2.id soit déclaré NOT NULL.


    Dans ton cas :

    select activites.act_id
    from activites
    left join inscriptions on (activites.act_id=inscriptions.act_id and inscriptions.adh_id=CETADHERENT)
    where inscriptions.act_id is null

  8. #8
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut cela parrait bon
    D'apres mon premier test cela à l'air bon.

    Merci pour vos contributions.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de requete multi table
    Par dembroski dans le forum Requêtes
    Réponses: 1
    Dernier message: 25/01/2011, 14h55
  2. Réponses: 7
    Dernier message: 22/08/2007, 11h49
  3. Meilleur type table pour stocker des valeurs numérique
    Par vodevil dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/04/2006, 20h42
  4. Boucler sur une table pour renommer des valeurs
    Par webwhisky dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 03/01/2006, 14h19
  5. requete multi table - multi champ
    Par Jean-Matt dans le forum Oracle
    Réponses: 6
    Dernier message: 14/10/2005, 17h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo