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
Libérer: 2025-01-23 16:13:13
original
987 Les gens l'ont consulté

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 :

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
Copier après la connexion

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
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal