Maison >base de données >tutoriel mysql >Pourquoi des lignes manquent-elles dans mon résultat de jointure externe gauche ?

Pourquoi des lignes manquent-elles dans mon résultat de jointure externe gauche ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-23 16:13:13921parcourir

Why are Rows Missing from My Left Outer Join Result?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn