Comprendre les lignes manquantes dans les jointures externes gauches
Un utilisateur tentant de calculer les pages vues quotidiennement a rencontré un problème courant de jointure externe gauche : des lignes manquantes dans le tableau de gauche. La requête visait à combiner les données des tables day
et tracking
à l'aide d'une jointure externe gauche :
SELECT day.days, COUNT(*) as opens FROM day LEFT OUTER JOIN tracking ON day.days = DAY(FROM_UNIXTIME(open_date)) WHERE tracking.open_id = 10 GROUP BY day.days
Le tableau day
contenait des données pour les jours 1 à 30, mais le résultat n'affichait que les jours 1 et 9. Cet écart provient de l'emplacement de la clause WHERE
.
Le problème : placement incorrect de la clause WHERE
La clause WHERE tracking.open_id = 10
filtre après la jointure. Cela signifie qu'il supprime les lignes où tracking.open_id
n'est pas 10, même si ces lignes proviennent du tableau de gauche (day
). Une jointure externe gauche est conçue pour inclure toutes les lignes de la table de gauche, quelles que soient les correspondances dans la table de droite. La clause WHERE
annule effectivement ce comportement.
La solution : intégrer le filtre dans la condition JOIN
Pour récupérer correctement tous les jours de la table day
, il faut intégrer la condition de filtrage dans la condition JOIN
elle-même :
SELECT day.days, COUNT(*) as opens FROM day LEFT OUTER JOIN tracking ON day.days = DAY(FROM_UNIXTIME(open_date)) AND tracking.open_id = 10 GROUP BY day.days
En déplaçant tracking.open_id = 10
dans la clause ON
, le filtrage se produit avant les lignes sont combinées. Cela garantit que seules les lignes correspondantes de la table tracking
(où open_id = 10
) sont prises en compte lors de la jointure, tout en conservant toutes les lignes de la table day
dans le résultat final. Cela reflète avec précision l'intention d'une jointure externe gauche.
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!