In MySQL, you can do this:
SELECT MSGs.* FROM MSGs JOIN ( SELECT CASE WHEN user_from < user_to THEN user_from ELSE user_to END id1, CASE WHEN user_from > user_to THEN user_from ELSE user_to END id2, MAX(send_time) max_time FROM MSGs --автор или получатель WHERE @UserId = user_from OR @UserId = user_to --группируем по двум столбцам GROUP BY CASE WHEN user_from < user_to THEN user_from ELSE user_to END, CASE WHEN user_from > user_to THEN user_from ELSE user_to END )T --соединяем по автору/получателю и времени сообщения ON send_time = max_time AND CASE WHEN user_from < user_to THEN user_from ELSE user_to END = id1 AND CASE WHEN user_from > user_to THEN user_from ELSE user_to END = id2 WHERE @UserId = user_from OR @UserId = user_to
In MS SQL, Oracle, PG SQL would be easier:
SELECT user_from, user_to, send_time FROM( SELECT MSGs.*, ROW_NUMBER()OVER(PARTITION BY CASE WHEN user_from < user_to THEN user_from ELSE user_to END, CASE WHEN user_from > user_to THEN user_from ELSE user_to END ORDER BY send_time DESC ) N FROM MSGs --автор или получатель WHERE @UserId = user_from OR @UserId = user_to )T WHERE N=1