Comment vous joignez-vous sur la même table, deux fois, dans mysql?

110

J'ai 2 tables. L'un (domaines) a des identifiants de domaine et des noms de domaine (dom_id, dom_url).

l'autre contient des 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 des domaines.

Facile.

Maintenant, je dois 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 domaines ON reviews.rev_dom_for = domains.dom_url, puis vous faites écho à la dom_url, qui ferait écho au nom de domaine dans la colonne rev_dom_for.

Mais comment le faire écho au 2ème nom de domaine, dans la colonne dom_rev_from?


la source

Réponses:

166

vous utiliseriez une autre jointure, quelque chose du 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

MODIFIER :

Tout ce que vous faites est de vous joindre à la table plusieurs fois. Regardez la requête dans le post: il 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 JOINS GAUCHE de la table DOMAIN, en les référençant par l'alias de table pour chaque joint en référence à la table Domains, et en les alias comme ToURL et FromUrl.

Pour plus d'informations sur l'aliasing dans SQL, lisez ici .

Stephen Wrighton
la source
5
l'astuce est que vous avez identifié chaque JOIN avec un nom «AS to» et «AS from» afin que vous puissiez les utiliser dans SELECT.
Matthew Smith
1
l'utilisation d'un mot-clé non pour un nom de table clarifierait. de plus, utilisez le mot-clé "as" lors de l'alias.
TheSoftwareJedi
Pardonnez-moi, mais je ne comprends toujours pas comment cela est censé fonctionner. Les 2 tables sont: domaines (dom_id, dom_url) et reviews (rev_id, rev_dom_from, rev_dom_for). Si quelqu'un pouvait écrire la requête exacte pour que je puisse comprendre, ce serait génial, car je n'ai aucune idée de ce que je dois modifier.
1
Considérez les alias comme faisant référence aux lignes de la table, et non à la table elle-même. Par analogie, dans une boucle comme "for (i = 0; i <max; i ++)" la variable i est une valeur itérative, ce n'est pas la boucle elle-même.
Bill Karwin
Je ne savais pas que vous pouviez faire ça en SQL, Gracias.
Adam F
8

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 Stephen Wrighton a écrit ci-dessus) L'astuce est que vous sélectionnez fondamentalement dans la table de domaine deux fois dans la même requête et joignez 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 avec exactement ce que vous ne comprenez pas.

delux247
la source
-1

Lisez ceci et essayez, cela vous aidera:

Tableau 1

column11,column12,column13,column14

Tableau 2

column21,column22,column23,column24


SELECT table1.column11,table1.column12,table2asnew1.column21,table2asnew2.column21 
FROM table1 INNER JOIN table2 AS table2asnew1 ON table1.column11=table2asnew1.column21  INNER TABLE table2 as table2asnew2 ON table1.column12=table2asnew2.column22

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

et

table2asnew2 est une autre instance du tableau 2 qui correspond à table1.column12=table2asnew2.column22

Ashekur Rahman molla Asik
la source