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