sql >> Database >  >> RDS >> Mysql

Geef prioriteit aan ORDER BY boven een GROUP BY in MySQL zonder subquery

ORDER BY wordt per definitie verwerkt na groeperen met GROUP BY. De conceptuele manier waarop een SELECT-instructie wordt verwerkt, is per definitie:

  1. Bereken het cartesiaanse product van alle tabellen waarnaar wordt verwezen in de FROM-clausule
  2. Pas de join-criteria uit de FROM-clausule toe om de resultaten te filteren
  3. Pas de filtercriteria in de WHERE-component toe om de resultaten verder te filteren
  4. Groepeer de resultaten in subsets op basis van de GROUP BY-clausule, vouw de resultaten samen tot een enkele rij voor elke dergelijke subset en bereken de waarden van alle geaggregeerde functies -- SUM() , MAX() , AVG() , enz. -- voor elk van deze subsets. Houd er rekening mee dat als er geen GROUP BY-clausule is opgegeven, de resultaten worden behandeld alsof er een enkele subset is en dat alle statistische functies van toepassing zijn op de volledige resultatenset, waarbij deze wordt samengevouwen tot een enkele rij.
  5. Filter de nu gegroepeerde resultaten op basis van de HAVING-clausule.
  6. Sorteer de resultaten op basis van de ORDER BY-clausule.

De enige kolommen die zijn toegestaan ​​in de resultatenset van een SELECT met een GROUP BY-clausule zijn natuurlijk

  • De kolommen waarnaar wordt verwezen in de GROUP BY-clausule
  • Aggregatiefuncties (zoals MAX() )
  • letterlijk/constanten
  • uitdrukkingen afgeleid van een van de bovenstaande.

Alleen kapotte SQL-implementaties staan ​​zaken toe als select xxx,yyy,a,b,c FROM foo GROUP BY xxx,yyy — de verwijzingen naar kolommen a, b en c zijn betekenisloos/niet gedefinieerd, aangezien de afzonderlijke groepen zijn samengevouwen tot een enkele rij,



  1. JPA + Hibernate:een beperking definiëren met ON DELETE CASCADE

  2. efficiënte manier om paging te implementeren

  3. Mysql join met time matching

  4. Hoe een beschadigde MPTT-boom (geneste set) in de database te repareren met behulp van SQL?