Jag ser ofta att folk kämpar med idén att gå med i ett bord för sig själv eller flera gånger i samma fråga (som det var här). När den väl bemästras är det en fantastisk teknik att använda på bord som har många relationer mellan raderna (som en lista över lag som måste spela mot varandra!). Som andra har påpekat måste du använda två inner join
s för att åstadkomma detta:
select
*
from
games g
inner join teams t1 on
g.teamid1 = t1.teamid
inner join teams t2 on
g.teamid2 = t2.teamid
Så, om dina games
tabellen ser ut så här:
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 2 1
Du kommer att få resultatuppsättningen:
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
Naturligtvis skulle jag kalla dessa kolumner i select
uttalande, om jag var jag, för användbarhetens skull:
select
g.GameID,
t1.Name as Team1,
t2.Name as Team2
from
...
På så sätt kan kolumner namnges på lämpligt sätt, istället för att ha t1
och t2
kolumner har samma namn.
Nu, för att ta itu med förvirringen om vad en left join
är. Du förstår, en left join
tar alla rader från den första (eller vänster) tabellen och matchar sedan alla rader i kopplingsvillkoret med den andra (eller höger) tabellen. För alla rader från den vänstra tabellen får du null
i alla kolumner till right
bord.
Fördjupa oss i ett exempel, låt oss säga att någon lagt in en null
för TeamID2
på en av raderna oavsett anledning. Låt oss också säga att ett team av TeamID
4 fanns förr, men finns inte längre.
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 1 null
Låt oss nu ta en titt på vad en left join
skulle vara i termer av frågan:
select
*
from
games g
left join teams t1 on
g.teamid1 = t1.teamid
left join teams t2 on
g.teamid2 = t2.teamid
Logiskt sett kommer detta att ta tag i alla våra games
, och matcha dem sedan mot respektive teams
. Men om ett TeamID
inte existerar får vi null
s. Det kommer att se ut så här:
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
Därför en left join
kommer endast vara nödvändigt om ett lag är valfritt.
I ditt fall kommer du att använda en inner join
att gå med i ett bord flera gånger. Detta är en mycket vanlig praxis och är ganska användbar. Det undviker några av fallgroparna med underfrågor (särskilt på MySQL), samtidigt som du kan ta data från tabellen för jämförelser mellan tabeller. Detta är mycket användbart när du försöker hitta ordningen på något, eller relaterade rader.
Hur som helst, jag hoppas att det här mycket stökiga svaret hjälper någon någonstans.