Ce n'est pas vrai. Il renverra une ligne aléatoire. En pratique, il s'agit souvent de la première ligne dans l'ordre des clés primaires, mais il n'y a aucune garantie. Les bases de données autres que MySQL ne permettent pas cette pratique et généreront une erreur.
Quoi qu'il en soit, une façon de récupérer l'ID le plus élevé des messages non lus consiste à joindre deux fois la table des messages. La deuxième jointure ne recherche que les messages non lus. Par exemple :
SELECT max(msg.ID) as MaxID
, messages.from
, max(unread.ID) as MaxUnreadID
, users.userName
FROM users
join messages msg
on users.ID = msg.from
and messages.to = ?
left join
messages unread
on users.ID = unread.from
and messages.to = ?
and unread.read = 0
GROUP BY
users.ID
, users.userName