Často vidím, že lidé bojují s myšlenkou připojit tabulku k sobě nebo vícekrát ve stejném dotazu (jak tomu bylo zde). Po zvládnutí je to skvělá technika pro použití na stolech, které mají mnoho vztahů mezi řadami (například seznam týmů, které musí hrát mezi sebou!). Jak již zdůraznili ostatní, musíte použít dva inner join jak toho dosáhnout:
select
*
from
games g
inner join teams t1 on
g.teamid1 = t1.teamid
inner join teams t2 on
g.teamid2 = t2.teamid
Pokud tedy vaše games tabulka vypadá takto:
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 2 1
Získáte sadu výsledků:
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
Samozřejmě bych tyto sloupce aliasoval v select prohlášení, kdybych byl já, kvůli použitelnosti:
select
g.GameID,
t1.Name as Team1,
t2.Name as Team2
from
...
Tímto způsobem mohou být sloupce pojmenovány vhodně, namísto toho, aby měly t1 a t2 sloupce mají stejné názvy.
Nyní k vyřešení nejasností ohledně left join je. Vidíte, left join vezme všechny řádky z první (nebo levé) tabulky a poté porovná všechny řádky na podmínce spojení s druhou (nebo pravou) tabulkou. Pro všechny řádky z levé tabulky získáte null ve všech sloupcích right tabulka.
Když se ponoříme do příkladu, řekněme, že někdo vložil null pro TeamID2 na jednom z řádků z jakéhokoli důvodu. Řekněme také, že tým TeamID 4 dříve existoval, ale již neexistuje.
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 1 null
Nyní se podívejme na to, jaké left join by bylo z hlediska dotazu:
select
*
from
games g
left join teams t1 on
g.teamid1 = t1.teamid
left join teams t2 on
g.teamid2 = t2.teamid
Logicky to zabere všechny naše games a poté je přiřaďte k příslušným teams . Pokud však TeamID neexistuje, dostaneme null s. Bude to vypadat takto:
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
Proto left join bude pouze je nutné, pokud je tým volitelný.
Ve vašem případě budete používat inner join připojit se ke stolu vícekrát. Toto je velmi běžná praxe a je docela užitečná. Vyhne se některým úskalím poddotazů (zejména na MySQL) a zároveň vám umožní získat data z tabulky pro intratable porovnání. To je velmi užitečné, když se snažíte najít pořadí něčeho nebo související řádky.
Každopádně doufám, že tato velmi nesourodá odpověď někde někomu pomůže.