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
Libérer: 2025-01-18 05:32:09
original
651 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal