Когда я решал эту задачу, для меня единственной проблемой было то. что у меня были лишние записи, например (sender_id, recipient_id) были (1,2) и (2,1) это были самые последние записи по времени с данными значениями, это достигалось с помощью Group by sender_id, recipient_id и max(time) в SELECT. Но одна запись была лишняя. Я искал как объединить эти две группы. Можно заметить, что одна из цифер всегда будет присутствовать в записи( в условии прописано, where recipient_id == @user_id and sender_id == @my_user, поэтому можно легко объединить эти две группы в одну по сумме этих чисел и не будет никаких конфликтов. Мне кажется, что легче не придумаешь. Весь запрос:
SELECT *, MAX(time), sender_id + recipient_id as my_sum FROM chat
WHERE sender_id == 1 or recipient_id == 1
GROUP BY my_sum
ORDER BY time DESC