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>
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>
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!