Come ci si unisce allo stesso tavolo, due volte, in mysql?


110

Ho 2 tavoli. Uno (domini) ha ID di dominio e nomi di dominio (dom_id, dom_url).

l'altra contiene dati effettivi, 2 delle quali colonne richiedono un nome di dominio A e DA. Quindi ho 2 colonne rev_dom_from e rev_dom_for, entrambe memorizzano l'id del nome di dominio, dalla tabella dei domini.

Semplice.

Ora ho bisogno di visualizzare effettivamente entrambi i nomi di dominio sulla pagina web. So come visualizzare l'uno o l'altro, tramite la query LEFT JOIN domains ON reviews.rev_dom_for = domains.dom_url, e poi echi il dom_url, che echeggia il nome del dominio nella colonna rev_dom_for.

Ma come farei a far risuonare il 2 ° nome di dominio, nella colonna dom_rev_from?

mysql 

Risposte:


166

useresti un altro join, qualcosa del genere:

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

MODIFICA :

Tutto quello che stai facendo è unirti al tavolo più volte. Guarda la query nel post: seleziona i valori dalle tabelle Reviews (alias come rvw), quella tabella ti fornisce 2 riferimenti alla tabella Domain (un FOR e un FROM).

A questo punto è semplice lasciare unirsi alla tabella Domain alla tabella Reviews. Una volta (alias come toD) per FOR e una seconda volta (alias come fromD) per FROM.

Quindi nell'elenco SELEZIONA, selezionerai i campi DOM_URL da entrambi LEFT JOINS della tabella DOMAIN, facendo riferimento ad essi tramite l'alias di tabella per ogni join in riferimento alla tabella Domains, e alias come ToURL e FromUrl.

Per maggiori informazioni sull'aliasing in SQL, leggi qui .


5
il trucco è che hai identificato ogni JOIN con un nome "AS to" e "AS from" in modo da poterli utilizzare in SELECT.
Matthew Smith,

1
l'utilizzo di una parola chiave non per il nome di una tabella chiarirebbe. inoltre, utilizza la parola chiave "as" durante l'alias.
TheSoftwareJedi

Perdonami, ma continuo a non capire come dovrebbe funzionare. Le 2 tabelle sono: domains (dom_id, dom_url) e reviews (rev_id, rev_dom_from, rev_dom_for). Se qualcuno potesse scrivere la query esatta in modo da farmi capire, sarebbe fantastico, perché non ho idea di cosa devo modificare.

1
Pensa agli alias come riferimenti alle righe della tabella, non alla tabella stessa. Per analogia, in un ciclo come "for (i = 0; i <max; i ++)" la variabile i è un valore iterativo, non è il ciclo stesso.
Bill Karwin

Non sapevo che potessi farlo in SQL, Gracias.
Adam F

8

Date le seguenti tabelle ..

Domain Table
dom_id | dom_url

Review Table
rev_id | rev_dom_from | rev_dom_for

Prova questo sql ... (è più o meno la stessa cosa che Stephen Wrighton ha scritto sopra) Il trucco è che stai praticamente selezionando due volte dalla tabella del dominio nella stessa query e unendo i risultati.

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

Se sei ancora bloccato, sii più specifico con il fatto che non capisci.


-1

Leggi questo e prova, questo ti aiuterà:

Tabella 1

column11,column12,column13,column14

Tavolo 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 è un'istanza della tabella 2 a cui corrisponde table1.column11=table2asnew1.column21

e

table2asnew2 è un'altra istanza della tabella 2 a cui corrisponde table1.column12=table2asnew2.column22

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.