Heim > Datenbank > MySQL-Tutorial > Warum gibt mein SQL COUNT(*) die Gesamtzahl anstelle der einzelnen Zeilenanzahlen zurück?

Warum gibt mein SQL COUNT(*) die Gesamtzahl anstelle der einzelnen Zeilenanzahlen zurück?

Susan Sarandon
Freigeben: 2025-01-18 05:41:09
Original
920 Leute haben es durchsucht

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

SQL-Abfrage gibt die Gesamtzeilenanzahl statt der einzelnen Zeilenanzahl zurück

Achten Sie beim Ausführen von SQL-Abfragen darauf, Aggregatfunktionen wie COUNT(*) korrekt zu verwenden, um falsche Ergebnisse zu vermeiden. Betrachten Sie die folgende Aussage:

<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>
Nach dem Login kopieren

Das Ziel dieser Abfrage besteht darin, Daten aus den Tabellen messages und messages_aura abzufragen und die Anzahl der Vorkommen von Aura-Nachrichten für jeden Benutzer zu zählen. Das Problem liegt jedoch in der Unterabfrage LEFT JOIN, wo die Klausel GROUP BY fehlt.

Problem: Ohne die GROUP BY-Klausel gibt die Unterabfrage die Gesamtzahl der Aura-Nachrichten für alle Benutzer zurück, anstatt die Anzahl für jeden Benutzer zu zählen. Infolgedessen zeigt die Ausgabe falsche Zählungen an, da alle Zeilen aggregiert werden, anstatt nach relevanten Spalten zu gruppieren.

Lösung: Um dieses Problem zu lösen, muss die GROUP BY-Klausel zur LEFT JOIN-Unterabfrage hinzugefügt werden:

<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>
Nach dem Login kopieren

Durch das Hinzufügen von GROUP BY AuraID, AuraStatus gruppiert die Unterabfrage nun die Ergebnisse nach diesen Spalten und stellt so sicher, dass die Aura-Anzahl für jeden Benutzer korrekt ist.

Das obige ist der detaillierte Inhalt vonWarum gibt mein SQL COUNT(*) die Gesamtzahl anstelle der einzelnen Zeilenanzahlen zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage