Problème de requête: Faire 2 jointures sur une même table

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème de requête: Faire 2 jointures sur une même table

par Henri » 10 juil. 2006, 19:02

Bien sûr que c'est obligatoire. Imagine que tu aies une table père/fils et que tu demandes

Code : Tout sélectionner

select a.prenom, b.prenom from personne a, personne b where a.personne_id=b.id
Tu auras comme résultat un truc du style :

Code : Tout sélectionner

prenom prenom jean jacques jean paul jacques paul
A partir de ça, tu peux nous dire qui sont les pères et qui sont les fils ? Non ? Eh bien, PHP non plus quand tu vas demander d'afficher $row['prenom']
C'est pour ça que tu vas écrire

Code : Tout sélectionner

select a.prenom as prenom_fils, b.prenom as prenom_pere from personne a, personne b where a.personne_id=b.id
Tu dis que tu as un nombre important de colonnes. Raison de plus pour bien dissocier les noms de colonne. Mais es-tu certain d'avoir besoin de toutes les colonnes ?

par Cyrano » 08 juil. 2006, 21:20

l'alias sur une auto-jointure pour indiquer dans quelle table chercher : songe en effet que MySQL va considérer chaque exemplaire d'une même table comme une table indépendante: or les noms de champs étant les mêmes pour chacune, MySQL doit pouvoir identifier le champ de quelle table il faut prendre : l'alias permet de le faire. Il est donc obligatoire.

par ChristopheG » 08 juil. 2006, 19:25

Très bien, cela correspond exactement à mon problème, apparement ca marche, mais il y a un truc qui m'enbete.

Faut il obligatoirement saisir des alias pour tous le noms de colonne.

Ma requete regroupe 5 tables pour lesquelles je me suis débrouillé à donner des noms différents à chaque colonne. J'utilise par la suite un nombre très important de noms de colonnes.

Est il possible de faire qque chose du genre :

SELECT p1.Pseudo AS PseudoFrom, p2.Pseudo AS PseudoTo ,*
FROM (Messages m
JOIN Pseudos p1 ON p1.idPseudo = m.idPseudoFrom)
JOIN Pseudos p2 ON p2.idPseudo = m.idPseudoTo

J'ai essayé ça, mais ça marche pas... :roll:

par kariboo » 27 avr. 2006, 22:35

Merci beaucoup pour la solution. Ca fonctionne :)
Je vais retenir la technique pour la prochaine fois.

Kariboo

par Hubert Roksor » 27 avr. 2006, 21:51

Il te faut donner un alias à chaque table, de cette façon tu peux utiliser plusieurs fois la même table sous différents noms. Par exemple:

Code : Tout sélectionner

SELECT p1.Pseudo AS PseudoFrom, p2.Pseudo AS PseudoTo, m.Message FROM (Messages m JOIN Pseudos p1 ON p1.idPseudo = m.idPseudoFrom) JOIN Pseudos p2 ON p2.idPseudo = m.idPseudoTo
J'utilise des parenthèses pour m'assurer que p2 est bien jointe à m et non à p1.

Problème de requête: Faire 2 jointures sur une même table

par kariboo » 27 avr. 2006, 21:25

Bonjour,

J'ai un petit problème de jointure SQL que je n'arrive pas à résoudre...

Voici mes tables:

Table Pseudos
idPseudo
Pseudo

Table Messages
idMessage
idPseudoFrom
idPseudoTo
Message

Je souhaiterai retourner le message avec les noms des pseudos:
idMessage, PseudoFrom, PseudoTo, Message

Je suis capable de le faire sur un seul pseudo....
"SELECT pseudo FROM Messages INNER JOIN Pseudos ON Pseudos.idPseudo=Messages.idPseudoFrom"

... mais pas sur l'autre! Quelqu'un peux m'aider?

Merci d'avance.

Kariboo