Maison > base de données > tutoriel mysql > Pourquoi ma jointure externe gauche ne renvoie-t-elle pas toutes les lignes de la table de gauche ?

Pourquoi ma jointure externe gauche ne renvoie-t-elle pas toutes les lignes de la table de gauche ?

Patricia Arquette
Libérer: 2025-01-23 15:51:10
original
617 Les gens l'ont consulté

Why Doesn't My Left Outer Join Return All Rows from the Left Table?

Jointures externes gauches : garantir une récupération complète des données de la table de gauche

Une idée fausse courante concernant les jointures externes gauches est qu'elles renvoient toujours toutes les lignes de la table de gauche. Ce n'est pas toujours vrai ; les lignes du tableau de gauche sont omises s'il n'existe aucune ligne correspondante dans le tableau de droite en fonction de la condition de jointure.

Illustrons cela avec un exemple. Imaginez une requête conçue pour compter les pages vues quotidiennement pour un utilisateur spécifique (open_id) :

<code class="language-sql">SELECT day.days, COUNT(*) AS views
FROM day
LEFT OUTER JOIN tracking
ON day.days = DAY(FROM_UNIXTIME(open_date))
WHERE tracking.open_id = 10
GROUP BY day.days</code>
Copier après la connexion

Cette requête vise à afficher tous les jours et le nombre de vues associé. Cependant, si day contient des entrées pour chaque jour du mois, mais tracking manque d'entrées pour certains jours pour open_id = 10, ces jours seront absents des résultats.

La solution réside dans l'incorporation de la condition de la clause WHERE dans la clause ON de la jointure :

<code class="language-sql">SELECT day.days, COUNT(tracking.open_date) AS views
FROM day
LEFT OUTER JOIN tracking
ON day.days = DAY(FROM_UNIXTIME(open_date)) AND tracking.open_id = 10
GROUP BY day.days</code>
Copier après la connexion

En déplaçant tracking.open_id = 10 dans la clause ON, la condition devient une partie de la jointure elle-même, et non un filtre post-jointure. Cela garantit que toutes les lignes de la table day sont incluses, views affichant 0 pour les jours sans entrées correspondantes dans la table tracking. Notez l'utilisation de COUNT(tracking.open_date) au lieu de COUNT(*) pour refléter avec précision le nombre de vues ; COUNT(*) compterait toujours les jours même s'il n'y avait aucune ligne correspondante dans le tableau de droite.

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!

source:php.cn
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