64 votes

Comment faire une jointure sur la même table, deux fois, dans mysql ?

J'ai deux tables. L'une (domaines) contient les identifiants de domaines et les noms de domaines (dom_id, dom_url).

l'autre contient les données réelles, dont 2 colonnes nécessitent un nom de domaine TO et FROM. J'ai donc 2 colonnes rev_dom_from et rev_dom_for, qui stockent toutes deux l'identifiant du nom de domaine, à partir de la table domains.

Simple.

Je dois maintenant afficher les deux noms de domaine sur la page web. Je sais comment afficher l'un ou l'autre, via la requête LEFT JOIN domains ON reviews.rev_dom_for = domains.dom_url, et ensuite on fait ressortir le dom_url, ce qui ferait ressortir le nom de domaine dans la colonne rev_dom_for.

Mais comment faire en sorte que le deuxième nom de domaine apparaisse dans la colonne dom_rev_from ?

94voto

Stephen Wrighton Points 15904

Vous utiliseriez un autre joint, quelque chose de ce genre :

SELECT toD.dom_url AS ToURL, 
    fromD.dom_url AS FromUrl, 
    rvw.*

FROM reviews AS rvw

LEFT JOIN domain AS toD 
    ON toD.Dom_ID = rvw.rev_dom_for

LEFT JOIN domain AS fromD 
    ON fromD.Dom_ID = rvw.rev_dom_from

EDITAR :

Tout ce que vous faites, c'est joindre la table plusieurs fois. Regardez la requête dans le post : elle sélectionne les valeurs des tables Reviews (alias rvw), cette table vous fournit 2 références à la table Domain (un FOR et un FROM).

À ce stade, il est simple de joindre à gauche la table Domain à la table Reviews. Une fois (alias toD) pour le FOR, et une seconde fois (alias fromD) pour le FROM.

Ensuite, dans la liste SELECT, vous sélectionnerez les champs DOM_URL des deux LEFT JOINS de la table DOMAIN, en les référençant par l'alias de la table pour chaque joint en référence à la table Domains, et en les aliasant comme ToURL et FromUrl.

Pour plus d'informations sur l'aliasing en SQL, lire aquí .

7voto

delux247 Points 1336

Compte tenu des tableaux suivants..

Domain Table
dom_id | dom_url

Review Table
rev_id | rev_dom_from | rev_dom_for

Essayez ce sql... (C'est à peu près la même chose que ce que Stephen Wrighton a écrit ci-dessus) L'astuce consiste à sélectionner deux fois la table du domaine dans la même requête et à joindre les résultats.

Select d1.dom_url, d2.dom_id from
review r, domain d1, domain d2
where d1.dom_id = r.rev_dom_from
and d2.dom_id = r.rev_dom_for

Si vous êtes toujours bloqué, veuillez être plus précis en indiquant exactement ce que vous ne comprenez pas.

0voto

Lisez ceci et essayez de vous aider

tableau1 :

colonne11,colonne12,colonne13,colonne14

tableau2 :

colonne21,colonne22,colonne23,colonne24

select table1.column11,table1.column12,table2asnew1.column21,table2asnew2.column21 from table1 inner join table2 as table2asnew1 on table1.column11=table2asnew1.column21 inner join table2 as table2asnew2 on table1.column12=table2asnew2.column22

table2asnew1 est une instance de la table 2 à laquelle correspond table1.column11=table2asnew1.column21

et

table2asnew2 est une autre instance de la table 2 à laquelle correspond table1.column12=table2asnew2.column22

Merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X