Du måste läsa upp group by
klausul.
MySQL är mycket mer tillåtande än det borde, vilket skapar förvirring i processen. I princip bör alla kolumner utan aggregat inkluderas i group by
klausul. Men MySQL syntaktisk socker tillåter att "glömma" kolumner. När du gör det spottar MySQL ut ett godtyckligt värde från uppsättningen som den grupperas efter. I ditt fall är den första raden i uppsättningen bob
, så det returnerar det.
Ditt första uttalande (med max()
utan en group by
) är helt enkelt felaktigt.
Om du vill ha en av de äldsta användarna, order by age desc limit 1
är det korrekta sättet att gå vidare.
Om du vill ha alla de äldsta användarna behöver du ett underval:
SELECT p.* FROM people p WHERE p.age = (select max(subp.age) from people subp);