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.