Es gibt eine supereinfache Möglichkeit, dies in MySQL zu tun:
select *
from (select * from mytable order by `Group`, age desc, Person) x
group by `Group`
Dies funktioniert, weil Sie in MySQL keine nicht gruppierten Spalten aggregieren dürfen. In diesem Fall gibt MySQL nur die erste Zeile zurück. Die Lösung besteht darin, zuerst die Daten so zu ordnen, dass für jede Gruppe zuerst die gewünschte Zeile und dann nach den Spalten gruppiert wird, für die Sie den Wert möchten.
Sie vermeiden komplizierte Unterabfragen, die versuchen, das max()
usw. zu finden , und auch die Probleme, mehrere Zeilen zurückzugeben, wenn es mehr als eine mit demselben Maximalwert gibt (wie es die anderen Antworten tun würden).
Hinweis: Dies ist eine reine MySQL- Lösung. Alle anderen mir bekannten Datenbanken geben einen SQL-Syntaxfehler mit der Meldung "Nicht aggregierte Spalten werden nicht in der Gruppe nach Klausel aufgeführt" oder ähnlichem aus. Da diese Lösung undokumentiertes Verhalten verwendet, möchten die vorsichtigen möglicherweise einen Test einschließen, um zu bestätigen, dass sie weiterhin funktionieren, falls eine zukünftige Version von MySQL dieses Verhalten ändert.
Update Version 5.7:
Seit Version 5.7 enthält die sql-mode
Einstellung ONLY_FULL_GROUP_BY
standardmäßig. Damit dies funktioniert, müssen Sie diese Option nicht haben (bearbeiten Sie die Optionsdatei für den Server, um diese Einstellung zu entfernen).