Jak dołączyć dwukrotnie do tego samego stołu w mysql?

110

Mam 2 stoły. Jedna (domeny) ma identyfikatory domen i nazwy domen (dom_id, dom_url).

druga zawiera rzeczywiste dane, z których 2 kolumny wymagają nazw domen DO i FROM. Mam więc 2 kolumny rev_dom_from i rev_dom_for, z których obie przechowują identyfikator nazwy domeny z tabeli domen.

Prosty.

Teraz muszę faktycznie wyświetlić obie nazwy domen na stronie internetowej. Wiem, jak wyświetlić jedną lub drugą, za pośrednictwem LEFT JOIN domeny ON reviews.rev_dom_for = domains.dom_url zapytanie, a następnie echo dom_url, które będzie odzwierciedlało nazwę domeny w kolumnie rev_dom_for.

Ale jak sprawić, by odbijała się echem drugiej nazwy domeny w kolumnie dom_rev_from?


źródło

Odpowiedzi:

166

użyłbyś innego sprzężenia, czegoś w ten sposób:

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

EDYCJA :

Wszystko, co robisz, to wielokrotne dołączanie do stołu. Spójrz na zapytanie w poście: wybiera wartości z tabel recenzji (aliasowanych jako rvw), ta tabela zawiera 2 odniesienia do tabeli domen (a FOR i FROM).

W tym momencie łatwo jest odejść i dołączyć do tabeli domen do tabeli recenzji. Raz (z aliasem jako toD) dla FOR i po raz drugi (z aliasem jako fromD) dla FROM.

Następnie na liście SELECT wybierzesz pola DOM_URL z obu LEFT JOINS tabeli DOMAIN, odwołując się do nich przez alias tabeli dla każdej połączonej w odniesieniu do tabeli Domains i aliasując je jako ToURL i FromUrl.

Aby uzyskać więcej informacji na temat aliasingu w SQL, przeczytaj tutaj .

Stephen Wrighton
źródło
5
sztuczka polega na tym, że zidentyfikowałeś każde JOIN nazwami „AS to” i „AS from”, aby móc ich używać w SELECT.
Matthew Smith,
1
użycie innego słowa kluczowego w nazwie tabeli mogłoby wyjaśnić. Ponadto podczas tworzenia aliasów należy używać słowa kluczowego „as”.
TheSoftwareJedi,
Wybacz mi, ale nadal nie rozumiem, jak to ma działać. Dwie tabele to: domeny (dom_id, dom_url) i recenzje (rev_id, rev_dom_from, rev_dom_for). Gdyby ktoś mógł napisać dokładne zapytanie, abym mógł to zrozumieć, byłoby świetnie, ponieważ nie mam pojęcia, co mam edytować.
1
Pomyśl o aliasach jako o odwołaniach do wierszy w tabeli, a nie o samej tabeli. Analogicznie, w pętli typu „for (i = 0; i <max; i ++)” zmienna i jest wartością iteracyjną, a nie samą pętlą.
Bill Karwin,
Nie wiedziałem, że możesz to zrobić w SQL, Gracias.
Adam F
8

Biorąc pod uwagę poniższe tabele ..

Domain Table
dom_id | dom_url

Review Table
rev_id | rev_dom_from | rev_dom_for

Spróbuj tego sql ... (To prawie to samo, co Stephen Wrighton napisał powyżej). Sztuczka polega na tym, że zasadniczo wybierasz z tabeli domeny dwa razy w tym samym zapytaniu i łączysz wyniki.

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

Jeśli nadal tkwisz w miejscu, podaj dokładniej, że nie rozumiesz.

delux247
źródło
-1

Przeczytaj to i spróbuj, to ci pomoże:

Tabela 1

column11,column12,column13,column14

Tabela 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 jest instancją tabeli 2, do której pasuje table1.column11=table2asnew1.column21

i

table2asnew2 to kolejna instancja tabeli 2, do której pasuje table1.column12=table2asnew2.column22

Ashekur Rahman molla Asik
źródło