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