Prostym rozwiązaniem jest umieszczenie zapytania w podselekcji za pomocą instrukcji ORDER pierwszy i zastosowanie GROUP BY później :
SELECT * FROM (
SELECT `timestamp`, `fromEmail`, `subject`
FROM `incomingEmails`
ORDER BY `timestamp` DESC
) AS tmp_table GROUP BY LOWER(`fromEmail`)
Jest to podobne do korzystania z połączenia, ale wygląda znacznie ładniej.
Używanie kolumn nieagregujących w SELECT z klauzulą GROUP BY jest niestandardowe. MySQL generalnie zwróci wartości pierwszego znalezionego wiersza i odrzuci resztę. Wszelkie klauzule ORDER BY będą miały zastosowanie tylko do zwróconej wartości kolumny, a nie do odrzuconych.
WAŻNA AKTUALIZACJA Wybieranie kolumn nieagregatowych używanych do pracy w praktyce, ale nie należy na nich polegać. Zgodnie z dokumentacją MySQL „jest to przydatne przede wszystkim wtedy, gdy wszystkie wartości w każdej niezagregowanej kolumnie, której nie wymieniono w GRUPA WEDŁUG, są takie same dla każdej grupy. Serwer może swobodnie wybrać dowolną wartość z każdej grupy, więc o ile nie są takie same, wybrane wartości są nieokreślone ”.
Od 5.7.5 ONLY_FULL_GROUP_BY jest domyślnie włączone, więc kolumny nie zagregowane powodują błędy zapytań (ER_WRONG_FIELD_WITH_GROUP)
Jak @mikep wskazuje poniżej, rozwiązaniem jest użycie DOWOLNA_WARTOŚĆ() od 5.7 i nowszych
Zobaczhttp://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/pl/miscellaneous-functions.html#function_any-value