Maison >base de données >tutoriel mysql >Pourquoi des lignes manquent-elles dans mon résultat de jointure externe gauche ?
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 :
<code class="language-sql">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</code>
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 :
<code class="language-sql">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</code>
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!