Często widzę, jak ludzie borykają się z pomysłem dołączenia tabeli do siebie lub wielu razy w tym samym zapytaniu (tak jak tutaj). Po opanowaniu jest to świetna technika do wykorzystania na stołach, które mają wiele relacji między rzędami (takich jak lista drużyn, które muszą ze sobą grać!). Jak zauważyli inni, musisz użyć dwóch inner join
aby to osiągnąć:
select
*
from
games g
inner join teams t1 on
g.teamid1 = t1.teamid
inner join teams t2 on
g.teamid2 = t2.teamid
Tak więc, jeśli twoje games
tabela wygląda tak:
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 2 1
Otrzymasz zestaw wyników:
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
Oczywiście aliasowałbym te kolumny w select
oświadczenie, gdybym był mną, ze względu na użyteczność:
select
g.GameID,
t1.Name as Team1,
t2.Name as Team2
from
...
W ten sposób kolumny można odpowiednio nazwać, zamiast mieć t1
i t2
kolumny mają te same nazwy.
Teraz, aby rozwiązać zamieszanie związane z tym, co left join
jest. Widzisz, left join
pobierze wszystkie wiersze z pierwszej (lub lewej) tabeli, a następnie dopasuje wszystkie wiersze warunku złączenia do drugiej (lub prawej) tabeli. Dla dowolnych wierszy z lewej tabeli otrzymasz null
we wszystkich kolumnach po right
tabela.
Zagłębiając się w przykład, powiedzmy, że ktoś umieścił null
dla TeamID2
w jednym z rzędów z jakiegokolwiek powodu. Załóżmy również, że zespół TeamID
4 kiedyś istniały, ale już nie ma.
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 1 null
Przyjrzyjmy się teraz, co left join
byłoby w zakresie zapytania:
select
*
from
games g
left join teams t1 on
g.teamid1 = t1.teamid
left join teams t2 on
g.teamid2 = t2.teamid
Logicznie, to złapie wszystkie nasze games
, a następnie dopasuj je do odpowiednich teams
. Jeśli jednak TeamID
nie istnieje, otrzymamy null
s. Wygląda to tak:
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
Dlatego left join
będzie tylko być konieczne, jeśli zespół jest opcjonalny.
W twoim przypadku użyjesz inner join
aby wielokrotnie dołączyć do stołu. Jest to bardzo powszechna praktyka i jest raczej przydatna. Pozwala uniknąć niektórych pułapek związanych z podzapytaniami (zwłaszcza w MySQL), jednocześnie umożliwiając pobieranie danych z tabeli do porównań między tabelami. Jest to bardzo przydatne, gdy próbujesz znaleźć kolejność czegoś lub powiązanych wierszy.
W każdym razie mam nadzieję, że ta bardzo chaotyczna odpowiedź gdzieś komuś pomoże.