Musisz przeczytać o group by klauzula.
MySQL jest o wiele bardziej liberalny niż powinien, wprowadzając zamieszanie w procesie. Zasadniczo każda kolumna bez agregatu powinna być uwzględniona w group by klauzula. Ale cukier składniowy MySQL pozwala „zapomnieć” o kolumnach. Kiedy to zrobisz, MySQL wypluwa dowolną wartość z zestawu, według którego grupuje. W twoim przypadku pierwszy wiersz w zestawie to bob , więc to zwraca.
Twoje pierwsze oświadczenie (za pomocą max() bez group by ) jest po prostu niepoprawne.
Jeśli chcesz jednego z najstarszych użytkowników, order by age desc limit 1 to właściwy sposób postępowania.
Jeśli chcesz wszystkich najstarszych użytkowników, potrzebujesz podwyboru:
SELECT p.* FROM people p WHERE p.age = (select max(subp.age) from people subp);