A menudo veo gente luchando con la idea de unir una tabla a sí misma o varias veces en la misma consulta (como sucedió aquí). Una vez dominada, es una excelente técnica para usar en mesas que tienen muchas relaciones entre filas (como una lista de equipos que tienen que jugar entre sí). Como han señalado otros, debe usar dos inner join
s para lograr esto:
select
*
from
games g
inner join teams t1 on
g.teamid1 = t1.teamid
inner join teams t2 on
g.teamid2 = t2.teamid
Entonces, si tus games
la tabla se ve así:
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 2 1
Obtendrá el 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
Por supuesto, pondría un alias a estas columnas en select
declaración, si yo fuera yo, por el bien de la usabilidad:
select
g.GameID,
t1.Name as Team1,
t2.Name as Team2
from
...
De esta manera, las columnas se pueden nombrar apropiadamente, en lugar de tener el t1
y t2
las columnas comparten los mismos nombres.
Ahora, para abordar la confusión sobre lo que una left join
es. Verás, una left join
tomará todas las filas de la primera tabla (o de la izquierda) y luego hará coincidir las filas en la condición de combinación con la segunda tabla (o de la derecha). Para cualquier fila de la tabla de la izquierda, obtendrá null
en todas las columnas a la right
mesa.
Profundizando en un ejemplo, digamos que alguien puso un null
para TeamID2
en una de las filas por cualquier motivo. Digamos también que un equipo de TeamID
4 solía existir, pero ya no existe.
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 1 null
Ahora, echemos un vistazo a lo que es una left join
sería en términos de la consulta:
select
*
from
games g
left join teams t1 on
g.teamid1 = t1.teamid
left join teams t2 on
g.teamid2 = t2.teamid
Lógicamente, esto capturará todos nuestros games
y luego emparejarlos con los respectivos teams
. Sin embargo, si un TeamID
no existe, obtendremos null
s. Se verá así:
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
Por lo tanto, una left join
solo ser necesario si un equipo es opcional.
En su caso, usará una inner join
para unirse a una mesa varias veces. Esta es una práctica muy común y es bastante útil. Evita algunas de las trampas de las subconsultas (especialmente en MySQL), al tiempo que le permite obtener datos de la tabla para realizar comparaciones entre tablas. Esto es notablemente útil cuando se trata de encontrar el orden de algo o filas relacionadas.
De todos modos, espero que esta respuesta tan incoherente ayude a alguien en alguna parte.