Maison > base de données > tutoriel mysql > Pourquoi ma jointure externe gauche ne renvoie-t-elle que deux lignes au lieu de trente ?

Pourquoi ma jointure externe gauche ne renvoie-t-elle que deux lignes au lieu de trente ?

Susan Sarandon
Libérer: 2025-01-23 16:02:11
original
964 Les gens l'ont consulté

Why Does My Left Outer Join Only Return Two Rows Instead of Thirty?

Dépannage d'une jointure externe gauche : pourquoi seules deux lignes ont été renvoyées

Un utilisateur a tenté de compter les pages vues quotidiennement à l'aide d'une jointure externe gauche, mais la requête n'a renvoyé de manière inattendue que deux lignes au lieu des trente attendues. Examinons la requête problématique et sa solution.

La requête originale :

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

Le problème : la clause WHERE après le JOIN

Le problème réside dans la clause WHERE tracking.open_id = 10. Cette condition est appliquée après la jointure externe gauche. Une jointure externe gauche est conçue pour inclure toutes les lignes du tableau de gauche (day), même s'il n'y a aucune correspondance dans le tableau de droite (tracking). Cependant, la clause WHERE filtre efficacement toutes les lignes où tracking.open_id n'est pas 10, éliminant ainsi les lignes de la table day qui n'ont pas d'entrée correspondante dans tracking avec open_id = 10.

La solution : intégrer la condition dans le JOIN

Pour récupérer les trente lignes de la table day, la condition de filtrage doit faire partie de la condition de jointure elle-même. Ceci est réalisé en utilisant AND :

<code class="language-sql">SELECT day.days, COUNT(tracking.open_id) 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>
Copier après la connexion

Notez le changement apporté à COUNT(tracking.open_id) : cela garantit que les jours sans entrées correspondantes dans tracking auront un compte de 0, plutôt que NULL, ce qui entraînerait des problèmes avec certains systèmes de base de données. Cette requête corrigée effectue correctement une jointure externe gauche et renvoie les trente lignes attendues, représentant avec précision les ouvertures de page quotidiennes.

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