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 :

Fonctionnement left join


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Par défaut Fonctionnement left join
    Bonjour,
    Apres mon passage dans le forum sql on m'a tuyauté pour un probleme sur l'utilisation des jointures externes. Je me suis donc renseigné dessus mais je bloque a un certain point. Pour simplifier au maximum j'épure mes tables de tous les champs non nécessaires a la compréhension du probème :
    individus (id_ind) # il s'agit d'un individu tout simple
    evenements (id_event, type_event) #il s'agit d'un evenement lié a un individu, par exemple le jour de sa naissance, ou son mariage
    assoc_evenements (id_individu_associe, id_event) #fait le lien entre un individu et un evenements, car il s'agit d'une relation de n a n

    ma requete: avoir une liste de tous les individus, avec l'id de l'évenement de sa naissance si il est renseigné, null sinon. J'ai donc testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select i.id_ind, e.id_event
    from individus i
    left join (assoc_evenements ae)
    on (i.id_ind=ae.id_individu_associe)
    left join (evenements e)
    on (ae.id_event=e.id_event and e.type_event='naissance')
    Seulement mon probleme et que en résultat j'ai plusieurs ligne par individus : autant que d'evenements qui lui sont associés, normal vu que dans mon premier left join il peut y avoir plusieurs correspondances.

    J'ai testé des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT JOIN (assoc_events ae, evenements e) ON (id_ind=ae.id_individu_associe AND ae.id_event=e.id_event and e.type_event='naissance')
    Mais la c'est la catastrophe, j'ai tous pleins de tuples en triple ou quadruple. J'ai essayé avec un inner join au lieu du cross join, pas mieux.

    J'ai tout de meme trouver un moyen d'y remédier, en calant une sous requetes dans le left join ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select i.id_ind, r.id_event
    from individus i 
    left join ((select * from assoc_evenements ae, evenements e where ae.id_event=e.id_event and e.type_event='naissance') as  r) 
    on (i.id_ind=r.id_individu_associe)
    Mais je pense que je me complique la vie comme ca et que ce cas doit etre prévu par le left join non ? D'autant plus qu'il s'agit ici d'un cas bien simplifié et que en pratique ca risque de venir horriblement lourd.

    Donc j'aimerais savoir comment fait on pour appliquer son left join a des tables sur lesquelles ont a déja fait des jointures ? Ou plus simplement quelle requetes viendrait proprement à bout de mon probleme ?

    Merci à tous

  2. #2
    Membre Expert
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Par défaut
    Bonjour,

    Ceci marche-t-il ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT i.id_ind, MAX(e.id_event) 
    FROM individus i 
    LEFT JOIN assoc_evenements ae ON (i.id_ind=ae.id_individu_associe) 
    LEFT JOIN evenements e ON (ae.id_event=e.id_event and e.type_event='naissance') 
    GROUP BY i.id_ind

  3. #3
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Par défaut
    Déja merci de répondre.
    Oui cela marche, mais ce n'est pas très propre comme solution c'est un peu de la magouille , d'autant plus que les données sont parfois des varchar ou autres. En fait ca marche surtout dans le cadre de cet exemple, mais si on a d'autres champs a rajouter il me semble que ca coince
    Mais bon c'est déja plus pratique que ma méthode, je vais peut etre m'orienter de ce coté. Mais en fait il semble que le seul fait de mettre un group by suffise, je ne comprends pas bien comment réagit mysql quand on fait un group by id_ind si il y a plusieurs tuples avec le meme id_ind ? Apparemment il ne retient qu'une ligne, mais avec quelles infos ?

  4. #4
    Membre Expert
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Par défaut
    Ca fonctionne avec le group by seul à cause d'une particularité de MySQL qui fait que dans ce type de cas, c'est la première ligne retournée qui est renvoyée. Dans le cas présent, je suppose l'évenement naissance est le premier pour chacun des individus.

    Mais bon, c'est pas le meilleur de MySQL qu'on a là

  5. #5
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Par défaut
    En effet, se fier sur ca c'est un peu bancal :s

  6. #6
    Membre Expert
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Par défaut
    Sinon pour revenir au problème, le meilleur rapport propreté/lourdeur serait probablement l'utilisation d'une vue.

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

Discussions similaires

  1. LEFT JOIN ne fonctionne pas
    Par gastoncs dans le forum Requêtes
    Réponses: 5
    Dernier message: 02/04/2012, 13h27
  2. Réponses: 3
    Dernier message: 06/06/2007, 18h45
  3. Interbase et left join
    Par Zog dans le forum Bases de données
    Réponses: 4
    Dernier message: 23/03/2004, 08h55
  4. Non coincident MySQL (Left Join)
    Par Remiguel dans le forum Requêtes
    Réponses: 6
    Dernier message: 03/11/2003, 21h25
  5. Export d'une vue avec LEFT JOIN
    Par schnourf dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/05/2003, 13h57

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