Mysql
 sql >> Base de données >  >> RDS >> Mysql

SQL - Joindre à gauche 2 clés étrangères à 1 clé primaire

Je vois souvent des gens lutter avec l'idée de joindre une table à elle-même ou plusieurs fois dans la même requête (comme c'était le cas ici). Une fois maîtrisée, c'est une excellente technique à utiliser sur des tables qui ont beaucoup de relations entre les lignes (comme une liste d'équipes qui doivent s'affronter !). Comme d'autres l'ont souligné, vous devez utiliser deux inner join s pour y parvenir :

select
    *
from
    games g
    inner join teams t1 on
        g.teamid1 = t1.teamid
    inner join teams t2 on
        g.teamid2 = t2.teamid

Ainsi, si vos games le tableau ressemble à ceci :

GameID    TeamID1    TeamID2
----------------------------
     1          1          3
     2          4          2
     3          2          1

Vous obtiendrez l'ensemble de résultats 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

Bien sûr, j'aliaserais ces colonnes dans le select déclaration, si j'étais moi, pour des raisons de convivialité :

select
    g.GameID,
    t1.Name as Team1,
    t2.Name as Team2
from
    ...

De cette façon, les colonnes peuvent être nommées de manière appropriée, au lieu d'avoir le t1 et t2 les colonnes partagent les mêmes noms.

Maintenant, pour dissiper la confusion sur ce qu'est une left join est. Vous voyez, une left join prendra toutes les lignes de la première table (ou de gauche), puis fera correspondre toutes les lignes de la condition de jointure à la deuxième table (ou de droite). Pour toutes les lignes du tableau de gauche, vous obtiendrez null dans toutes les colonnes de right tableau.

En fouillant dans un exemple, disons que quelqu'un a mis un null pour TeamID2 sur l'une des rangées pour quelque raison que ce soit. Disons aussi qu'une équipe de TeamID 4 existait, mais n'existe plus.

GameID    TeamID1    TeamID2
----------------------------
     1          1          3
     2          4          2
     3          1       null

Voyons maintenant ce qu'est une left join serait en termes de requête :

select
    *
from
    games g
    left join teams t1 on
        g.teamid1 = t1.teamid
    left join teams t2 on
        g.teamid2 = t2.teamid

Logiquement, cela saisira tous nos games , puis associez-les aux teams respectives . Cependant, si un TeamID n'existe pas, nous obtiendrons null s. Cela ressemblera à ceci :

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

Par conséquent, une left join sera seulement être nécessaire si une équipe est facultative.

Dans votre cas, vous utiliserez une inner join rejoindre une table plusieurs fois. C'est une pratique très courante et plutôt utile. Il évite certains des pièges des sous-requêtes (en particulier sur MySQL), tout en vous permettant de récupérer des données de la table pour des comparaisons intratables. Ceci est particulièrement utile lorsque vous essayez de trouver l'ordre de quelque chose ou des lignes associées.

Quoi qu'il en soit, j'espère que cette réponse très décousue aidera quelqu'un quelque part.