Ich sehe oft Leute, die mit der Idee kämpfen, eine Tabelle mit sich selbst oder mehrmals in derselben Abfrage zu verbinden (sozusagen hier). Einmal gemeistert, ist es eine großartige Technik, die man an Tischen anwenden kann, die viele Beziehungen zwischen den Reihen haben (z. B. eine Liste von Teams, die gegeneinander spielen müssen!). Wie andere bereits betont haben, müssen Sie zwei inner join
verwenden s um dies zu erreichen:
select
*
from
games g
inner join teams t1 on
g.teamid1 = t1.teamid
inner join teams t2 on
g.teamid2 = t2.teamid
Also, wenn Ihre games
Tabelle sieht so aus:
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 2 1
Sie erhalten die Ergebnismenge von:
g.GameID g.TeamID1 g.TeamID2 t1.TeamID t1.Name t2.TeamID t2.Name
----------------------------------------------------------------------------------
1 1 3 1 Lions 3 Bears
2 4 2 4 Oh My 2 Tigers
3 2 1 2 Tigers 1 Lions
Natürlich würde ich diese Spalten im select
aliasieren Aussage, wenn ich ich wäre, der Benutzerfreundlichkeit halber:
select
g.GameID,
t1.Name as Team1,
t2.Name as Team2
from
...
Auf diese Weise können Spalten angemessen benannt werden, anstatt den t1
zu haben und t2
Spalten haben dieselben Namen.
Nun, um die Verwirrung darüber anzusprechen, was ein left join
ist ist. Sie sehen, ein left join
nimmt alle Zeilen aus der ersten (oder linken) Tabelle und gleicht dann alle Zeilen der Join-Bedingung mit der zweiten (oder rechten) Tabelle ab. Für alle Zeilen aus der linken Tabelle erhalten Sie null
in allen Spalten right
Tabelle.
Um uns ein Beispiel anzusehen, nehmen wir an, jemand hat einen null
eingegeben für TeamID2
in einer der Reihen aus welchem Grund auch immer. Nehmen wir auch an, dass ein Team von TeamID
4 gab es früher, gibt es aber nicht mehr.
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 1 null
Schauen wir uns nun an, was ein left join
ist wäre in Bezug auf die Abfrage:
select
*
from
games g
left join teams t1 on
g.teamid1 = t1.teamid
left join teams t2 on
g.teamid2 = t2.teamid
Logischerweise werden dadurch alle unsere games
erfasst , und ordnen Sie sie dann den jeweiligen teams
zu . Wenn jedoch eine TeamID
nicht existiert, erhalten wir null
s. Es sieht so aus:
g.GameID g.TeamID1 g.TeamID2 t1.TeamID t1.Name t2.TeamID t2.Name
----------------------------------------------------------------------------------
1 1 3 1 Lions 3 Bears
2 4 2 null null 2 Tigers
3 1 null 1 Lions null null
Daher ein left join
wird nur erforderlich sein, wenn ein Team optional ist.
In Ihrem Fall verwenden Sie einen inner join
sich mehrmals an einen Tisch setzen. Dies ist eine sehr gängige Praxis und ziemlich nützlich. Es vermeidet einige der Fallstricke von Unterabfragen (insbesondere bei MySQL), während Sie gleichzeitig Daten aus der Tabelle für intratable-Vergleiche abrufen können. Dies ist ausgesprochen nützlich, wenn Sie versuchen, die Reihenfolge von etwas oder verwandten Zeilen zu finden.
Wie auch immer, ich hoffe, diese sehr weitschweifige Antwort hilft jemandem irgendwo.