Devi leggere il group by
clausola.
MySQL è molto più permissivo di quanto dovrebbe, introducendo confusione nel processo. Fondamentalmente, qualsiasi colonna senza un aggregato dovrebbe essere inclusa nel group by
clausola. Ma lo zucchero sintattico MySQL consente di "dimenticare" le colonne. Quando lo fai, MySQL sputa un valore arbitrario dal set in base al quale sta raggruppando. Nel tuo caso, la prima riga del set è bob
, quindi lo restituisce.
La tua prima affermazione (usando max()
senza un group by
) è semplicemente errato.
Se vuoi uno degli utenti più anziani, order by age desc limit 1
è il modo corretto di procedere.
Se vuoi tutti gli utenti più vecchi, hai bisogno di una sottoselezione:
SELECT p.* FROM people p WHERE p.age = (select max(subp.age) from people subp);