sql >> Base de Datos >  >> RDS >> Mysql

Dar prioridad a ORDER BY sobre un GROUP BY en MySQL sin subconsulta

Por definición, ORDER BY se procesa después agrupar con GROUP BY. Por definición, la forma conceptual en que se procesa cualquier instrucción SELECT es:

  1. Calcule el producto cartesiano de todas las tablas a las que se hace referencia en la cláusula FROM
  2. Aplique los criterios de combinación de la cláusula FROM para filtrar los resultados
  3. Aplique los criterios de filtro en la cláusula WHERE para filtrar aún más los resultados
  4. Agrupe los resultados en subconjuntos según la cláusula GROUP BY, colapsando los resultados en una sola fila para cada subconjunto y calculando los valores de cualquier función agregada -- SUM() , MAX() , AVG() , etc., para cada uno de esos subconjuntos. Tenga en cuenta que si no se especifica la cláusula GROUP BY, los resultados se tratan como si hubiera un solo subconjunto y cualquier función agregada se aplica a todo el conjunto de resultados, colapsándolo en una sola fila.
  5. Filtrar los resultados ahora agrupados según la cláusula HAVING.
  6. Ordenar los resultados según la cláusula ORDER BY.

Las únicas columnas permitidas en el conjunto de resultados de un SELECT con una cláusula GROUP BY son, por supuesto,

  • Las columnas a las que se hace referencia en la cláusula GROUP BY
  • Funciones agregadas (como MAX() )
  • literal/constantes
  • expresiones derivadas de cualquiera de las anteriores.

Solo las implementaciones de SQL rotas permiten cosas como select xxx,yyy,a,b,c FROM foo GROUP BY xxx,yyy — las referencias a las columnas a, b y c carecen de sentido/no están definidas, dado que los grupos individuales se han colapsado en una sola fila,