Débogage des LEFT JOIN SQL : nombre de visites précis
Un problème courant survient lors de l'utilisation de plusieurs LEFT JOIN
en SQL pour compter les visites dans différentes tables. Cet exemple utilise trois tables : users
, grocery
et fishmarket
. Une requête conçue pour compter les visites de chaque utilisateur dans les épiceries et les poissonneries produit des résultats inexacts.
Le problème vient de la nature séquentielle des jointures. Une approche naïve rejoint users
et grocery
en premier, créant une ligne pour chaque utilisateur avec un account_balance
non nul et ses visites à l'épicerie. La jointure suivante avec fishmarket
multiplie ensuite de manière incorrecte le nombre de visites à l'épicerie par le nombre de visites à la poissonnerie pour chaque utilisateur. Cela conduit à des totaux de visites gonflés.
La solution consiste à restructurer la requête pour agréger le nombre de visites avant de les joindre à la table users
. Ceci est accompli efficacement à l’aide de deux sous-requêtes corrélées. Chaque sous-requête compte indépendamment les visites pour la table grocery
ou fishmarket
, regroupées par user_id
. Ces décomptes agrégés sont ensuite joints au tableau users
, garantissant des totaux de visites précis.
Voici la requête corrigée utilisant des sous-requêtes :
<code class="language-sql">SELECT u.id, u.account_balance, g.grocery_visits, f.fishmarket_visits FROM users u LEFT JOIN ( SELECT user_id, COUNT(*) AS grocery_visits FROM grocery GROUP BY user_id ) g ON g.user_id = u.id LEFT JOIN ( SELECT user_id, COUNT(*) AS fishmarket_visits FROM fishmarket GROUP BY user_id ) f ON f.user_id = u.id ORDER BY u.id;</code>
Cette requête révisée fournit un décompte précis et indépendant des visites à l'épicerie et au marché aux poissons pour chaque utilisateur, résolvant ainsi l'erreur de multiplication de la requête d'origine.
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!