Maison > base de données > tutoriel mysql > Pourquoi mon SQL COUNT(*) renvoie-t-il le total au lieu du nombre de lignes individuelles ?

Pourquoi mon SQL COUNT(*) renvoie-t-il le total au lieu du nombre de lignes individuelles ?

Susan Sarandon
Libérer: 2025-01-18 05:41:09
original
920 Les gens l'ont consulté

Why Does My SQL COUNT(*) Return the Total Instead of Individual Row Counts?

La requête SQL renvoie le nombre total de lignes au lieu du nombre de lignes individuelles

Lors de l'exécution de requêtes SQL, veillez à utiliser correctement les fonctions d'agrégation telles que COUNT(*) pour éviter des résultats incorrects. Considérez la déclaration suivante :

<code class="language-sql">SELECT `ID`, `To`, `Poster`, `Content`, `Time`, ifnull(`Aura`, 0) AS `Aura`
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)
GROUP BY `ID`, `Poster`
ORDER BY `Time` DESC
LIMIT 10;</code>
Copier après la connexion

Le but de cette requête est d'interroger les données des tables messages et messages_aura et de compter le nombre d'occurrences de messages d'aura pour chaque utilisateur. Cependant, le problème réside dans la sous-requête LEFT JOIN, où la clause GROUP BY est manquante.

Problème : Sans la clause GROUP BY, la sous-requête renverra le nombre total de messages aura pour tous les utilisateurs au lieu de compter le nombre pour chaque utilisateur. Par conséquent, la sortie affiche des décomptes incorrects, car elle regroupe toutes les lignes au lieu de les regrouper par colonnes pertinentes.

Solution : Pour résoudre ce problème, la clause GROUP BY doit être ajoutée à 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

En ajoutant GROUP BY AuraID, AuraStatus, la sous-requête regroupe désormais les résultats selon ces colonnes, garantissant ainsi que le nombre d'auras pour chaque utilisateur est exact.

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