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 :

Jointures sur plusieurs tables


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Jointures sur plusieurs tables
    Salut tout le monde,

    J'imagine que la question a été posée des centaines de fois, mais après une recherche approfondie sur le net, des heures de lecture sur le site et des poignées de cheveux (blancs) arrachées, je suis toujours en train de batailler avec une requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT 
         m.reference, m.datrequete,
         mr.idsociete,
         GROUP_CONCAT(c.societe) as societes,
         mexp.id
     
         FROM mission m
         INNER JOIN mission_requerant as mr ON mr.reference=m.reference
         INNER JOIN clients as c ON c.id=mr.idsociete
         LEFT JOIN mission_expertise as mexp ON mexp.reference=m.reference
     
        WHERE m.expert='EXPERT' AND m.etat!='off' AND (mexp.id IS NULL OR mexp.id IS NOT NULL) 
        GROUP BY m.id
    Je vous explique : j'ai plusieurs tables qui ont toutes un champ nommé 'reference' que j'utilise pour la relation de tables. Jusqu'ici, pas de soucis, sauf que je voudrais éviter de faire des requêtes imbriquées car cela ralentira considérablement le bousin.

    Je tente donc d'utiliser les Jointures, mais je rencontre un gros soucis,
    en l'occurence, pour la requête ci-dessus, j'ajoute seulement une table "mission_expertise", et ça commence déjà à partir en sucette :

    Dès que j'ai des résultats dans la table mission_expertise, les résultats liés à la table clients sont doublés. En gros, j'ai deux fois le nom de chaque client qui apparait dans le résultat de la requete :

    client1, client1, client2, client2

    Si je retire la table mission_expertise, j'obtiens alors quelque chose de correct :

    client1, client2

    Je sais pas si je suis suffisament clair dans mon explication... j'avoue que j'ai un peu de mal à synthétiser tout ça.

    Y a quelqu'un dans la salle pour aider une quiche comme moi ?

    D'avance merci

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Quelques remarques sur votre requête...
    1) A quoi sert la condition suivante ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND (mexp.id IS NULL OR mexp.id IS NOT NULL)
    Elle sera toujours vraie !

    2) La syntaxe normalisée du GROUP BY voudrait que toutes les colonnes du SELECT ne faisant l'objet d'une fonction de regroupement figurent dans la clause GROUP BY.
    m.reference et m.datrequete sont fonctionnellement dépendants de m.id donc ces colonnes devraient donner la bonne valeur et MySQL accepte que ces colonnes soient ommises.
    Par contre, mr.idsociete et mexp.id faisant partie d'autres tables, la valeur donnée par la requête sera probablement aléatoire.

    3) En SQL, la différence ne s'écrit pas != comme en PHP mais <>.

    4) D'après la condition de jointure entre clients et mission_requerant, mr.idsociete est en fait l'identifiant du client.
    Vous voulez concaténer la liste des clients mais pas les identifiants donc ce que je disais plus haut est sans doute vrai : l'identifiant du client sera pris au hasard parmi la liste concaténée des c.societe.

    Si je comprends bien le sens de votre requête, vous souhaitez afficher la liste des clients de chaque mission, ainsi que l'identifiant de l'expertise ?
    Il semble qu'il n'y ait au plus qu'une expertise par mission ? Alors mexp.id devrait pouvoir être omis sans dommage dans la clause GROUP BY.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT m.reference, m.datrequete,
      GROUP_CONCAT(c.id, c.societe ORDER BY c.societe SEPARATOR ' ') AS societes,
      mexp.id
    FROM mission m
    INNER JOIN mission_requerant AS mr ON mr.reference = m.reference
      INNER JOIN clients AS c ON c.id = mr.idsociete
    LEFT JOIN mission_expertise AS mexp ON mexp.reference = m.reference
    WHERE m.expert = 'EXPERT' 
      AND m.etat <> 'off' 
    GROUP BY m.id, m.reference, m.datrequete
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci pour la réponse aussi rapide.

    En fait j'ai besoin de récupérer plusieurs id dans mission_expertise (mais pas seulement, j'ai 5 ou 6 tables qui contiennent également plusieurs entrées que je dois récupérer pour la même référence).

    A priori le problème viendrait d'une mauvaise utilisation du GROUP BY.

    J'ai essayé le code, j'ai toujours le même soucis :

    Des que j'ai plus d'une entrée dans mission_expertise qui correspondent à cette reference, le nom des clients relatifs à cette reference apparaissent plusieurs fois. Selon le group by, j'ai :
    - client 1, client 1, client 2, client 2
    ou
    - client 1, client 2, client 1, client 2

    A priori ca boucle deux fois de suite sur les clients, je ne m'explique pas pourquoi.

    (pour le coup de NULL, oui, je confirme, en fait je faisais tout un tas de tests pour essayer de piger, mais j'ai oublié de retirer avant de publier).

    Merci pour votre aide.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Commencez par retirer GROUP_CONCAT et GROUP BY puis analyser le résultat qui vous fera peut-être comprendre pourquoi les clients sont répétés plusieurs fois pour chaque m.id.

    Sans jeu de données ni résultat obtenu, c'est difficile pour nous d'imaginer ce qui se passe.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Comment éviter les jointure sur plusieurs tables
    Par xavier81 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/02/2011, 15h12
  2. Problème de jointure sur plusieurs tables
    Par papouuu dans le forum Langage SQL
    Réponses: 1
    Dernier message: 25/01/2011, 14h02
  3. [AC-2007] Jointure sur plusieurs tables
    Par Steph0 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 20/01/2011, 08h24
  4. jointure sur plusieurs tables fonctionne pas
    Par jmsch dans le forum Requêtes
    Réponses: 1
    Dernier message: 03/11/2010, 21h55
  5. hibernate-criteria : jointure sur plusieurs tables
    Par loic72 dans le forum Hibernate
    Réponses: 9
    Dernier message: 24/09/2007, 17h27

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