Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Dê prioridade a ORDER BY sobre um GROUP BY no MySQL sem subconsulta


Por definição, ORDER BY é processado depois agrupamento com GROUP BY. Por definição, a forma conceitual como qualquer instrução SELECT é processada é:
  1. Calcule o produto cartesiano de todas as tabelas referenciadas na cláusula FROM
  2. Aplique os critérios de junção da cláusula FROM para filtrar os resultados
  3. Aplique os critérios de filtro na cláusula WHERE para filtrar ainda mais os resultados
  4. Agrupe os resultados em subconjuntos com base na cláusula GROUP BY, recolhendo os resultados em uma única linha para cada um desses subconjuntos e calculando os valores de qualquer função agregada -- SUM() , MAX() , AVG() , etc. -- para cada um desses subconjuntos. Observe que, se nenhuma cláusula GROUP BY for especificada, os resultados serão tratados como se houvesse um único subconjunto e todas as funções de agregação se aplicarão a todo o conjunto de resultados, reduzindo-o a uma única linha.
  5. Filtre os resultados agora agrupados com base na cláusula HAVING.
  6. Classifique os resultados com base na cláusula ORDER BY.

As únicas colunas permitidas no conjunto de resultados de um SELECT com uma cláusula GROUP BY são, obviamente,
  • As colunas referenciadas na cláusula GROUP BY
  • Funções agregadas (como MAX() )
  • literais/constantes
  • expressões derivadas de qualquer um dos itens acima.

Apenas implementações SQL quebradas permitem coisas como select xxx,yyy,a,b,c FROM foo GROUP BY xxx,yyy — as referências às colunas a, b e c não têm sentido/indefinidas, dado que os grupos individuais foram reduzidos a uma única linha,