Muitas vezes vejo pessoas lutando com a ideia de unir uma tabela a si mesma ou várias vezes na mesma consulta (como aqui). Uma vez dominada, é uma ótima técnica para usar em tabelas que têm muitos relacionamentos entre as linhas (como uma lista de equipes que precisam jogar entre si!). Como outros apontaram, você precisa usar duas
inner join
s para fazer isso:select
*
from
games g
inner join teams t1 on
g.teamid1 = t1.teamid
inner join teams t2 on
g.teamid2 = t2.teamid
Então, se seus
games
tabela fica assim:GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 2 1
Você obterá o conjunto de resultados de:
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
Claro, eu usaria um alias para essas colunas no
select
declaração, se eu fosse eu, por uma questão de usabilidade:select
g.GameID,
t1.Name as Team1,
t2.Name as Team2
from
...
Dessa forma, as colunas podem ser nomeadas apropriadamente, em vez de ter o
t1
e t2
colunas compartilham os mesmos nomes. Agora, para resolver a confusão sobre o que é uma
left join
é. Veja, uma left join
pegará todas as linhas da primeira tabela (ou da esquerda) e, em seguida, fará a correspondência de todas as linhas na condição de junção com a segunda tabela (ou da direita). Para qualquer linha da tabela à esquerda, você obterá null
em todas as colunas à right
tabela. Aprofundando em um exemplo, digamos que alguém colocou um
null
para TeamID2
em uma das linhas por qualquer motivo. Digamos também que uma equipe de TeamID
4 existia, mas não existe mais. GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 1 null
Agora, vamos dar uma olhada no que é uma
left join
seria em termos da consulta:select
*
from
games g
left join teams t1 on
g.teamid1 = t1.teamid
left join teams t2 on
g.teamid2 = t2.teamid
Logicamente, isso pegará todos os nossos
games
e, em seguida, combiná-los com as respectivas teams
. No entanto, se um TeamID
não existe, obteremos null
s. Vai ficar assim: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
Portanto, uma
left join
será somente ser necessário se uma equipe for opcional. No seu caso, você usará uma
inner join
para juntar-se a uma mesa várias vezes. Esta é uma prática muito comum e bastante útil. Ele evita algumas das armadilhas das subconsultas (especialmente no MySQL), enquanto permite que você pegue dados da tabela para comparações intratable. Isso é muito útil ao tentar encontrar a ordem de algo ou linhas relacionadas. De qualquer forma, espero que esta resposta muito desconexa ajude alguém em algum lugar.