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

Geben Sie ORDER BY Vorrang vor GROUP BY in MySQL ohne Unterabfrage

Per Definition wird ORDER BY nach verarbeitet Gruppierung mit GROUP BY. Per Definition wird jede SELECT-Anweisung konzeptionell wie folgt verarbeitet:

  1. Berechnen Sie das kartesische Produkt aller Tabellen, auf die in der FROM-Klausel verwiesen wird
  2. Wenden Sie die Join-Kriterien aus der FROM-Klausel an, um die Ergebnisse zu filtern
  3. Wenden Sie die Filterkriterien in der WHERE-Klausel an, um die Ergebnisse weiter zu filtern
  4. Gruppieren Sie die Ergebnisse basierend auf der GROUP BY-Klausel in Teilmengen, fassen Sie die Ergebnisse für jede solche Teilmenge in eine einzelne Zeile zusammen und berechnen Sie die Werte aller Aggregatfunktionen – SUM() , MAX() , AVG() usw. – für jede solche Teilmenge. Beachten Sie, dass, wenn keine GROUP BY-Klausel angegeben ist, die Ergebnisse so behandelt werden, als gäbe es eine einzelne Teilmenge, und alle Aggregatfunktionen gelten für die gesamte Ergebnismenge, wodurch sie auf eine einzelne Zeile reduziert wird.
  5. Filtern Sie die jetzt gruppierten Ergebnisse basierend auf der HAVING-Klausel.
  6. Sortieren Sie die Ergebnisse basierend auf der ORDER BY-Klausel.

Die einzigen Spalten, die in der Ergebnismenge eines SELECT mit einer GROUP BY-Klausel erlaubt sind, sind natürlich

  • Die Spalten, auf die in der GROUP BY-Klausel verwiesen wird
  • Aggregatfunktionen (wie MAX() )
  • Literal/Konstanten
  • Ausdrücke, die von einem der oben genannten abgeleitet sind.

Nur fehlerhafte SQL-Implementierungen erlauben Dinge wie select xxx,yyy,a,b,c FROM foo GROUP BY xxx,yyy — die Verweise auf die Spalten a, b und c sind bedeutungslos/undefiniert, da die einzelnen Gruppen auf eine einzige Zeile reduziert wurden,