Maison >base de données >tutoriel mysql >Pourquoi ma fonction SQL COUNT compte-t-elle toutes les lignes au lieu de lignes distinctes ?

Pourquoi ma fonction SQL COUNT compte-t-elle toutes les lignes au lieu de lignes distinctes ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-18 05:32:09701parcourir

Why Is My SQL COUNT Function Counting All Rows Instead of Distinct Rows?

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!

Déclaration:
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