Maison >base de données >tutoriel mysql >Jointure gauche ou jointure interne : comment une clause WHERE affecte-t-elle les résultats d'une jointure gauche ?
Jointure gauche et jointure interne
En SQL, les jointures gauches et les jointures internes sont deux types de jointures fondamentaux qui génèrent des ensembles de résultats distincts. Une jointure gauche renvoie toutes les lignes de la table de gauche et fait correspondre les lignes de la table de droite en fonction d'une condition de jointure. Si aucune correspondance n'est trouvée, les valeurs manquantes dans le tableau de droite sont représentées par des valeurs NULL. En revanche, une jointure interne renvoie uniquement les lignes qui remplissent la condition de jointure, à l'exclusion des lignes des deux tables qui ne satisfont pas à cette condition.
Modification du comportement de jointure à gauche
Dans la requête SQL fournie :
SELECT a.foo b.bar c.foobar FROM tableOne AS a INNER JOIN tableTwo AS b ON a.pk = b.fk LEFT JOIN tableThree AS c ON b.pk = c.fk WHERE a.foo = 'something' AND c.foobar = 'somethingelse'
La présence de la clause WHERE c.foobar = 'somethingelse' après le LEFT La condition JOIN a un effet surprenant. Il semble convertir la jointure gauche en une jointure interne, ce qui entraîne le retour d'aucune ligne si « quelque chose d'autre » n'est pas présent dans la table Trois.
Explication
Cela semble étrange le comportement découle de l’ordre d’évaluation des instructions SQL. La clause WHERE est traitée une fois les jointures effectuées. Par conséquent, lorsque c.foobar = 'somethingelse' est spécifié dans la clause WHERE, il filtre efficacement toutes les lignes de la jointure gauche où c.foobar est NULL. Par conséquent, seules les lignes où c.foobar correspond à la valeur spécifiée (« quelque chose d'autre ») sont conservées dans l'ensemble de résultats final.
Solution
Pour conserver la valeur souhaitée comportement de jointure à gauche, il existe deux options :
Modifier la clause WHERE pour inclure OR c.foobar IS NULL, comme indiqué ci-dessous :
WHERE a.foo = 'something' AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
Cela permet aux lignes où c.foobar est NULL d'être incluses dans l'ensemble de résultats.
Déplacez le c.foobar = comparaison 'quelque chose d'autre' dans la clause ON de la jointure gauche, garantissant que seules les lignes satisfaisant cette condition sont incluses dans le résultat ensemble :
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!