Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Abfrage mit GROUP BY und ORDER BY funktioniert nicht, wenn mehrere Spalten in SELECT ausgewählt sind

Sie müssen vorsichtig sein, wenn Sie GROUP BY verwenden . Sobald Sie verstanden haben, was GROUP BY ist tut, wirst du das Problem selbst kennen. Es führt eine Aggregation Ihrer Daten durch oder mit anderen Worten, es reduziert Ihre Daten, indem es einige Operationen an den Roheinträgen durchführt und eine neue reduzierte Anzahl von Einträgen erstellt, auf die eine Aggregationsfunktion angewendet wurde (SUM, COUNT, AVG usw.)

Die Felder, die Sie in GROUP BY bereitstellen -Klausel stellt die Aggregations-/Rollup-Ebene dar, die Sie anstreben.

SELECT col2, col3 FROM tbl WHERE col1 IS NULL GROUP BY col1 ORDER BY col1

Hier versuchen Sie, die Aggregation bei col1 durchzuführen Ebene, d. h. für jeden eindeutigen Wert in Spalte col1 , werden einige Operationen an einigen anderen Spalten durchgeführt, die Sie in SELECT angeben Klausel (hier col2 ,col3 ), sodass Sie in der Ausgabe sich nicht wiederholende Werte in col1 haben und einige zusammengefasste Werte von col2 und col3 gegen jeden einzelnen col1 Wert basierend auf der Funktion, die Sie anwenden (SUM, COUNT, AVG usw.).

Wie wenden Sie diese Funktion an? Das fehlt in Ihrer obigen Abfrage. Um es zu lösen, müssen Sie eine Aggregationsfunktion auf die Felder anwenden, die in SELECT vorhanden sind -Klausel, aber nicht in GROUP BY Klausel. Nehmen Sie ein Beispiel für SUM und versuchen Sie Folgendes:

SELECT SUM(col2), SUM(col3) FROM tbl WHERE col1 IS NULL GROUP BY col1 ORDER BY col1

ODER für eine bessere Idee, entfernen Sie WHERE filtern und die Ausgabe überprüfen, indem Sie Folgendes ausführen:

SELECT col1, SUM(col2), SUM(col3) FROM tbl GROUP BY col1 ORDER BY col1

Außerdem den Grund für Ihre andere Anfrage

SELECT col2 FROM tbl WHERE col1 IS NULL GROUP BY col2 ORDER BY col2

funktioniert, weil Sie keine Aggregation auf das Feld anwenden müssen (hier col2 ), die in GROUP BY vorhanden ist Klausel.