Jest bardzo prosty sposób, aby to zrobić w mysql:
select *
from (select * from mytable order by `Group`, age desc, Person) x
group by `Group`
Działa to, ponieważ w mysql nie można agregować kolumn nie grupujących według, w którym to przypadku mysql zwraca tylko pierwszy wiersz. Rozwiązaniem jest takie uporządkowanie danych, aby dla każdej grupy najpierw był wiersz, który chcesz, a następnie grupowanie według kolumn, dla których chcesz uzyskać wartość.
Unikasz skomplikowanych podzapytań, które próbują znaleźć max()
itp., A także problemów ze zwracaniem wielu wierszy, gdy jest więcej niż jeden o tej samej wartości maksymalnej (tak jak zrobiłyby to inne odpowiedzi)
Uwaga: jest to rozwiązanie tylko dla MySQL . Wszystkie inne bazy danych, które znam, wyrzucą błąd składniowy SQL z komunikatem „kolumny nie zagregowane nie są wymienione w grupie według klauzul” lub podobne. Ponieważ to rozwiązanie wykorzystuje nieudokumentowane zachowanie, bardziej ostrożni mogą chcieć dołączyć test, aby stwierdzić, że nadal działa, jeśli przyszła wersja MySQL zmieni to zachowanie.
Aktualizacja wersji 5.7:
Od wersji 5.7 sql-mode
ustawienie zawiera ONLY_FULL_GROUP_BY
domyślnie, więc aby to zadziałało, nie możesz mieć tej opcji (edytuj plik opcji dla serwera, aby usunąć to ustawienie).