Você precisa ler sobre o
group by
cláusula. O MySQL está sendo muito mais permissivo do que deveria, introduzindo confusão no processo. Basicamente, qualquer coluna sem um agregado deve ser incluída no
group by
cláusula. Mas o açúcar sintático do MySQL permite "esquecer" as colunas. Quando você faz isso, o MySQL cospe um valor arbitrário do conjunto pelo qual está agrupando. No seu caso, a primeira linha do conjunto é bob
, então ele retorna isso. Sua primeira instrução (usando
max()
sem um group by
) está simplesmente incorreto. Se você quiser um dos usuários mais antigos,
order by age desc limit 1
é a forma correta de proceder. Se você quiser todos os usuários mais antigos, precisará de uma subseleção:
SELECT p.* FROM people p WHERE p.age = (select max(subp.age) from people subp);