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>
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>
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!