Experimente este simples e fácil, ele também encontrará os usuários de cada grupo Veja meu código:-
select m.* ,u.*
from
messages m
inner join (
select max(id) as maxid
from messages
where messages.fromUser = "$myUsreId"
OR messages.forUser = "$myUsreId"
group By (if(fromUser > forUser, fromUser, forUser)),
(if(fromUser > forUser, forUser, fromUser))
) t1 on m.id=t1.maxid
join
users u ON u.id = (CASE WHEN m.fromUser = "$myUsreId"
THEN m.forUser
ELSE m.fromUser
END)