Heim > Datenbank > MySQL-Tutorial > Warum zählt meine SQL-COUNT-Funktion alle Zeilen statt einzelne Zeilen?

Warum zählt meine SQL-COUNT-Funktion alle Zeilen statt einzelne Zeilen?

Linda Hamilton
Freigeben: 2025-01-18 05:32:09
Original
651 Leute haben es durchsucht

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

Fehlerbehebung bei SQL COUNT: Warum alle Zeilen statt einzelner Zeilen gezählt werden

Dieser Artikel befasst sich mit einem häufigen SQL-Problem: einer COUNT-Funktion, die eine Gesamtzeilenanzahl anstelle einer eindeutigen Anzahl zurückgibt. Wir analysieren eine problematische SQL-Anweisung und zeigen, wie man sie korrigiert.

Die folgende SQL-Abfrage zielt darauf ab, einzelne Zeilen zu zählen, zählt jedoch fälschlicherweise alle Zeilen:

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

Das Problem liegt in der Unterabfrage LEFT JOIN. Es fehlt eine entscheidende GROUP BY-Klausel. Die Funktion COUNT(*) ohne GROUP BY aggregiert über alle Zeilen in messages_aura.

Um dies zu beheben, müssen wir eine GROUP BY-Klausel zur LEFT JOIN-Unterabfrage hinzufügen:

<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

Dieses überarbeitete LEFT JOIN gruppiert die Ergebnisse jetzt korrekt nach AuraID und AuraStatus, bevor die Funktion COUNT(*) angewendet wird. Dadurch wird sichergestellt, dass die Funktion COUNT auf unterschiedliche Kombinationen von AuraID und AuraStatus angewendet wird und die gewünschte Anzahl einzelner Zeilen erzeugt. Die korrigierte Abfrage zählt dann genau wie beabsichtigt unterschiedliche Zeilen.

Das obige ist der detaillierte Inhalt vonWarum zählt meine SQL-COUNT-Funktion alle Zeilen statt einzelne Zeilen?. 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