Č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.