Dans le domaine d'un assistant de base de données, effectuer des récupérations de données complexes à l'aide de jointures gauches est une pratique courante. Cependant, parfois, la jointure gauche ne se comporte pas tout à fait comme prévu.
Imaginez la requête 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';
Curieusement, lorsque la condition c.foobar est placée dans la clause WHERE comme ci-dessus, la jointure supposée gauche semble se transformer en une jointure interne. Les résultats ne sont renvoyés que si les critères a.foo et c.foobar sont remplis.
Pourquoi cette métamorphose ? La clé réside dans la clause WHERE. Lorsqu'une valeur du côté droit d'une jointure gauche (côté droit faisant référence au tableau situé à droite de la clause ON) est spécifiée dans la clause WHERE, toutes les valeurs NULL sont ignorées, réduisant ainsi la jointure gauche à une jointure interne. En termes simples, si c.foobar n'est pas présent dans la tableThree, la requête ne renvoie aucune ligne.
Pour contourner ce problème, il existe deux options :
AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
Le choix entre ces solutions dépend des exigences spécifiques de la requête. Cependant, comprendre le comportement sous-jacent des jointures gauches en présence de clauses WHERE est crucial pour maîtriser les techniques de récupération de données.
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!