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

MySQL Agrupar por y Ordenar por

Una solución simple es envolver la consulta en una subselección con la instrucción ORDER primero y aplicando el GROUP BY más tarde :

SELECT * FROM ( 
    SELECT `timestamp`, `fromEmail`, `subject`
    FROM `incomingEmails` 
    ORDER BY `timestamp` DESC
) AS tmp_table GROUP BY LOWER(`fromEmail`)

Esto es similar a usar la unión pero se ve mucho mejor.

El uso de columnas no agregadas en un SELECT con una cláusula GROUP BY no es estándar. MySQL generalmente devolverá los valores de la primera fila que encuentre y descartará el resto. Cualquier cláusula ORDER BY solo se aplicará al valor de columna devuelto, no a los descartados.

ACTUALIZACIÓN IMPORTANTE La selección de columnas no agregadas solía funcionar en la práctica, pero no se debe confiar en ellas. Según la documentación de MySQL "esto es útil principalmente cuando todos los valores en cada columna no agregada no nombrada en GROUP BY son los mismos para cada grupo. El servidor es libre de elegir cualquier valor de cada grupo, por lo que a menos que sean iguales, los valores elegidos son indeterminados ."

A partir de 5.7.5 ONLY_FULL_GROUP_BY está habilitado de forma predeterminada, por lo que las columnas no agregadas provocan errores de consulta (ER_WRONG_FIELD_WITH_GROUP)

Como @mikep señala a continuación, la solución es usar CUALQUIER_VALOR() desde 5.7 y superior

Consulte http://www.cafewebmaster.com/mysql-order-sort-group https://dev.mysql.com/doc /refman/5.6/en/group-by-handling.html https://dev.mysql.com/doc /refman/5.7/en/group-by-handling.html https://dev.mysql.com /doc/refman/5.7/es/funciones-varias.html#funcion_cualquier-valor