Mysql
 sql >> Base de données >  >> RDS >> Mysql

Donner la priorité à ORDER BY sur GROUP BY dans MySQL sans sous-requête

Par définition, ORDER BY est traité après groupement avec GROUP BY. Par définition, la façon conceptuelle dont toute instruction SELECT est traitée est :

  1. Calculer le produit cartésien de toutes les tables référencées dans la clause FROM
  2. Appliquez les critères de jointure de la clause FROM pour filtrer les résultats
  3. Appliquez les critères de filtrage dans la clause WHERE pour filtrer davantage les résultats
  4. Regroupez les résultats en sous-ensembles en fonction de la clause GROUP BY, en regroupant les résultats sur une seule ligne pour chacun de ces sous-ensembles et en calculant les valeurs de toutes les fonctions d'agrégation -- SUM() , MAX() , AVG() , etc. -- pour chacun de ces sous-ensembles. Notez que si aucune clause GROUP BY n'est spécifiée, les résultats sont traités comme s'il existait un seul sous-ensemble et toutes les fonctions d'agrégation s'appliquent à l'ensemble des résultats, en le réduisant à une seule ligne.
  5. Filtrez les résultats désormais groupés en fonction de la clause HAVING.
  6. Trier les résultats en fonction de la clause ORDER BY.

Les seules colonnes autorisées dans le jeu de résultats d'un SELECT avec une clause GROUP BY sont, bien sûr,

  • Les colonnes référencées dans la clause GROUP BY
  • Fonctions d'agrégation (telles que MAX() )
  • littéral/constantes
  • expressions dérivées de l'un des éléments ci-dessus.

Seules les implémentations SQL cassées autorisent des choses comme select xxx,yyy,a,b,c FROM foo GROUP BY xxx,yyy — les références aux colonnes a, b et c n'ont pas de sens/indéfinies, étant donné que les groupes individuels ont été réduits à une seule ligne,