Wie können Sie zweimal in MySQL am selben Tisch teilnehmen?


110

Ich habe 2 Tische. Eine (Domänen) hat Domänen-IDs und Domänennamen (dom_id, dom_url).

Die andere enthält tatsächliche Daten, von denen 2 Spalten einen TO- und einen FROM-Domänennamen erfordern. Ich habe also 2 Spalten rev_dom_from und rev_dom_for, die beide die Domainnamen-ID aus der Domänentabelle speichern.

Einfach.

Jetzt muss ich tatsächlich beide Domainnamen auf der Webseite anzeigen. Ich weiß, wie das eine oder andere über die Abfrage LEFT JOIN Domains ON reviews.rev_dom_for = Domains.dom_url angezeigt wird, und dann geben Sie die dom_url aus, die den Domainnamen in der Spalte rev_dom_for wiedergibt.

Aber wie würde ich dafür sorgen, dass der zweite Domainname in der Spalte dom_rev_from wiedergegeben wird?

mysql 

Antworten:


166

Sie würden einen anderen Join verwenden, etwas in dieser Richtung:

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

EDIT :

Alles, was Sie tun, ist, mehrmals an der Tabelle teilzunehmen. Schauen Sie sich die Abfrage im Beitrag an: Sie wählt die Werte aus den Reviews-Tabellen aus (Alias ​​als rvw). Diese Tabelle enthält 2 Verweise auf die Domain-Tabelle (FOR und FROM).

An diesem Punkt ist es ganz einfach, die Domain-Tabelle mit der Reviews-Tabelle zu verknüpfen. Einmal (Alias ​​als toD) für das FOR und ein zweites Mal (Alias ​​als fromD) für das FROM.

Anschließend wählen Sie in der Liste SELECT die Felder DOM_URL aus beiden LEFT JOINS der Tabelle DOMAIN aus, verweisen auf sie durch den Tabellenalias für jede Verknüpfung in Bezug auf die Tabelle Domains und aliasen sie als ToURL und FromUrl.

Weitere Informationen zum Aliasing in SQL finden Sie hier .


5
Der Trick besteht darin, dass Sie jedes JOIN mit den Namen 'AS to' und 'AS from' identifiziert haben, damit Sie sie in SELECT verwenden können.
Matthew Smith

1
Die Verwendung eines Nicht-Schlüsselworts für einen Tabellennamen würde dies verdeutlichen. Verwenden Sie außerdem beim Aliasing das Schlüsselwort "as".
TheSoftwareJedi

Vergib mir, aber ich verstehe immer noch nicht, wie das funktionieren soll. Die 2 Tabellen sind: Domänen (dom_id, dom_url) und Überprüfungen (rev_id, rev_dom_from, rev_dom_for). Wenn jemand die genaue Abfrage schreiben könnte, damit ich den Dreh raus bekomme, wäre das großartig, da ich keine Ahnung habe, was ich bearbeiten muss.

1
Stellen Sie sich die Aliase als Verweis auf Zeilen in der Tabelle vor, nicht auf die Tabelle selbst. Analog dazu ist in einer Schleife wie "for (i = 0; i <max; i ++)" die Variable i ein iterierender Wert, nicht die Schleife selbst.
Bill Karwin

Ich wusste nicht, dass Sie dies in SQL tun können, Gracias.
Adam F

8

Angesichts der folgenden Tabellen ..

Domain Table
dom_id | dom_url

Review Table
rev_id | rev_dom_from | rev_dom_for

Probieren Sie diese SQL aus ... (Es ist so ziemlich das Gleiche, das Stephen Wrighton oben geschrieben hat) Der Trick besteht darin, dass Sie im Grunde zweimal in derselben Abfrage aus der Domänentabelle auswählen und die Ergebnisse zusammenfügen.

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

Wenn Sie immer noch nicht weiterkommen, geben Sie bitte genau an, was Sie nicht verstehen.


-1

Lesen Sie dies und versuchen Sie, dies wird Ihnen helfen:

Tabelle 1

column11,column12,column13,column14

Tabelle 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 ist eine Instanz von Tabelle 2, die mit übereinstimmt table1.column11=table2asnew1.column21

und

table2asnew2 ist eine weitere Instanz von Tabelle 2, die mit übereinstimmt table1.column12=table2asnew2.column22

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.