sql >> Base de Datos >  >> RDS >> Mysql

SQL:unir a la izquierda 2 claves externas a 1 clave principal

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.