Dépannage de SQL COUNT : pourquoi il compte toutes les lignes au lieu de celles distinctes
Cet article aborde un problème SQL courant : une fonction COUNT
renvoyant un nombre total de lignes au lieu d'un nombre distinct. Nous analyserons une instruction SQL problématique et montrerons comment la corriger.
La requête SQL suivante vise à compter les lignes individuelles, mais elle compte incorrectement toutes les lignes :
<code class="language-sql">SELECT `ID`, `To`, `Poster`, `Content`, `Time`, ifnull(`Aura`, 0) AS `Aura` FROM ( SELECT * FROM ( SELECT DISTINCT * FROM messages m INNER JOIN ( SELECT Friend2 AS Friend FROM friends WHERE Friend1 = '1' UNION ALL SELECT Friend1 AS Friend FROM friends WHERE Friend2 = '1' ) friends ON m.Poster = friends.`Friend` UNION ALL SELECT DISTINCT *, '1' FROM messages WHERE `Poster` = '1' ) var LEFT JOIN ( SELECT `ID` AS `AuraID`, `Status` AS `AuraStatus`, COUNT(*) AS `Aura` FROM messages_aura ) aura ON (var.Poster = aura.AuraID AND var.ID = aura.AuraStatus) ) final GROUP BY `ID`, `Poster` ORDER BY `Time` DESC LIMIT 10;</code>
Le problème réside dans la sous-requête LEFT JOIN
. Il manque une clause GROUP BY
cruciale. La fonction COUNT(*)
, sans GROUP BY
, regroupe toutes les lignes de messages_aura
.
Pour résoudre ce problème, nous devons ajouter une clause GROUP BY
à la sous-requête LEFT JOIN
:
<code class="language-sql">LEFT JOIN ( SELECT `ID` AS `AuraID`, `Status` AS `AuraStatus`, COUNT(*) AS `Aura` FROM messages_aura GROUP BY AuraID, AuraStatus ) aura ON (var.Poster = aura.AuraID AND var.ID = aura.AuraStatus)</code>
Ce LEFT JOIN
révisé regroupe désormais correctement les résultats par AuraID
et AuraStatus
avant d'appliquer la fonction COUNT(*)
. Cela garantit que la fonction COUNT
fonctionne sur des combinaisons distinctes de AuraID
et AuraStatus
, produisant le nombre de lignes individuelles souhaité. La requête corrigée comptera alors avec précision les lignes distinctes comme prévu.
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!