Les bizarreries des jointures gauches et des clauses WHERE
Lors de l'exécution d'opérations de récupération de données, les développeurs utilisent souvent des jointures gauches pour combiner les informations de plusieurs tables. Cependant, un piège courant survient lors de l'utilisation d'une clause WHERE en conjonction avec une jointure gauche, transformant potentiellement le comportement de la jointure gauche.
Considérez l'instruction SQL suivante :
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'
Intuitivement, on pourrait attendez-vous à ce que cette instruction effectue une jointure gauche entre tableThree et tableTwo, en spécifiant une condition de filtre pour c.foobar. Cependant, la présence de la clause WHERE contenant c.foobar = 'somethingelse' modifie par inadvertance les caractéristiques de la jointure gauche.
Lorsqu'une valeur du côté droit d'une jointure gauche (dans ce cas, c.foobar) est incluse dans la clause WHERE, seules les lignes dont la valeur est NOT NULL sont incluses dans le jeu de résultats. Ainsi, la jointure gauche se comporte effectivement comme une jointure interne, éliminant toutes les lignes avec des valeurs NULL pour c.foobar.
Pour préserver le comportement prévu de la jointure gauche dans l'exemple ci-dessus, on peut utiliser l'une des méthodes suivantes approches :
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!