In realtà non è vero. Restituirà una riga casuale. In pratica, questa è spesso la prima riga nell'ordine della chiave primaria, ma non vi è alcuna garanzia. Database diversi da MySQL non consentono questa pratica e genereranno un errore.
Ad ogni modo, un modo per recuperare l'ID più alto di messaggi non letti è unire due volte la tabella dei messaggi. Il secondo join cerca solo i messaggi non letti. Ad esempio:
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