Mysql
 sql >> Database >  >> RDS >> Mysql

Assegna la priorità a ORDER BY su GROUP BY in MySQL senza sottoquery

Per definizione, ORDER BY viene elaborato dopo raggruppamento con GROUP BY. Per definizione, il modo concettuale in cui viene elaborata qualsiasi istruzione SELECT è:

  1. Calcola il prodotto cartesiano di tutte le tabelle a cui si fa riferimento nella clausola FROM
  2. Applica i criteri di unione dalla clausola FROM per filtrare i risultati
  3. Applica i criteri di filtro nella clausola WHERE per filtrare ulteriormente i risultati
  4. Raggruppa i risultati in sottoinsiemi in base alla clausola GROUP BY, comprimendo i risultati in una singola riga per ciascuno di questi sottoinsiemi e calcolando i valori di qualsiasi funzione aggregata -- SUM() , MAX() , AVG() , ecc. -- per ciascuno di questi sottoinsiemi. Tieni presente che se non viene specificata alcuna clausola GROUP BY, i risultati vengono trattati come se esistesse un unico sottoinsieme e qualsiasi funzione di aggregazione si applica all'intero insieme di risultati, comprimendolo in un'unica riga.
  5. Filtra i risultati ora raggruppati in base alla clausola HAVING.
  6. Ordina i risultati in base alla clausola ORDER BY.

Le uniche colonne consentite nel set di risultati di un SELECT con una clausola GROUP BY sono, ovviamente,

  • Le colonne a cui si fa riferimento nella clausola GROUP BY
  • Funzioni aggregate (come MAX() )
  • letterale/costanti
  • espressioni derivate da una delle precedenti.

Solo le implementazioni SQL non funzionanti consentono cose come select xxx,yyy,a,b,c FROM foo GROUP BY xxx,yyy — i riferimenti alle colonne a, b e c sono privi di significato/indefinito, dato che i singoli gruppi sono stati compressi in un'unica riga,