Често виждам хора да се борят с идеята да се присъединят към таблица сама по себе си или няколко пъти в една и съща заявка (както беше тук). Веднъж усвоена, това е страхотна техника за използване на маси, които имат много връзки между редовете (като списък с отбори, които трябва да играят един срещу друг!). Както посочиха други, трябва да използвате две inner join
s, за да постигнете това:
select
*
from
games g
inner join teams t1 on
g.teamid1 = t1.teamid
inner join teams t2 on
g.teamid2 = t2.teamid
Така че, ако вашите games
таблицата изглежда така:
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 2 1
Ще получите набор от резултати от:
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
Разбира се, бих сложил псевдоними на тези колони в select
изявление, ако бях на мое място, в името на използваемостта:
select
g.GameID,
t1.Name as Team1,
t2.Name as Team2
from
...
По този начин колоните могат да бъдат именувани по подходящ начин, вместо да имат t1
и t2
колоните споделят едни и същи имена.
Сега, за да се справим с объркването относно това какво е left join
е. Виждате, left join
ще вземе всички редове от първата (или лявата) таблица и след това ще съпостави всички редове на условието за присъединяване към втората (или дясна) таблица. За всички редове от лявата таблица ще получите null
във всички колони в right
таблица.
Задълбочавайки се в пример, да кажем, че някой е поставил null
за TeamID2
на един от редовете по някаква причина. Да кажем също, че екип от TeamID
4 съществуваше, но вече не съществува.
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 1 null
Сега нека да разгледаме какво е left join
би било по отношение на заявката:
select
*
from
games g
left join teams t1 on
g.teamid1 = t1.teamid
left join teams t2 on
g.teamid2 = t2.teamid
Логично, това ще грабне всички наши games
и след това ги съпоставете със съответните teams
. Въпреки това, ако TeamID
не съществува, ще получим null
с. Ще изглежда така:
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
Следователно, left join
ще само е необходимо, ако екипът не е задължителен.
Във вашия случай ще използвате inner join
да се присъедините към маса няколко пъти. Това е много често срещана практика и е доста полезна. Той избягва някои от капаните на подзаявките (особено в MySQL), като същевременно ви позволява да вземете данни от таблицата за вътрешни сравнения в таблица. Това е изключително полезно, когато се опитвате да намерите реда на нещо или свързани редове.
Както и да е, надявам се, че този много бърз отговор ще помогне на някого някъде.