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

MySQL Group By e Order By


Uma solução simples é envolver a consulta em uma subseleção com a instrução ORDER primeiro e aplicando o GROUP BY mais tarde :
SELECT * FROM ( 
    SELECT `timestamp`, `fromEmail`, `subject`
    FROM `incomingEmails` 
    ORDER BY `timestamp` DESC
) AS tmp_table GROUP BY LOWER(`fromEmail`)

Isso é semelhante ao uso da junção, mas parece muito melhor.

O uso de colunas não agregadas em um SELECT com uma cláusula GROUP BY não é padrão. O MySQL geralmente retornará os valores da primeira linha que encontrar e descartará o resto. Quaisquer cláusulas ORDER BY serão aplicadas apenas ao valor da coluna retornado, não aos descartados.

ATUALIZAÇÃO IMPORTANTE A seleção de colunas não agregadas costumava funcionar na prática, mas não deve ser confiável. De acordo com a documentação do MySQL "isso é útil principalmente quando todos os valores em cada coluna não agregada não nomeada no GROUP BY são os mesmos para cada grupo. O servidor é livre para escolher qualquer valor de cada grupo, então a menos que sejam os mesmos, os valores escolhidos são indeterminados ."

A partir de 5.7.5 ONLY_FULL_GROUP_BY está ativado por padrão, portanto, colunas não agregadas causam erros de consulta (ER_WRONG_FIELD_WITH_GROUP)

Como @mikep aponta abaixo, a solução é usar ANY_VALUE() de 5,7 e acima

Veja 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/en/miscellaneous-functions.html#function_any-value