Ако разбирам правилно вашето изискване, искате да получите най-новата дата на съобщение за всеки разговор, включващ определен потребител. В този случай можем да обобщим разговорите за даден потребител и да запазим най-новата дата на съобщението.
SELECT m1.*
FROM messages m1
INNER JOIN
(
SELECT LEAST(sender_id, recipient_id) AS first,
GREATEST(sender_id, recipient_id) AS second,
MAX(created_at) AS recent_date
FROM messages
WHERE sender_id = 2 OR recipient_id = 2
GROUP BY LEAST(sender_id, recipient_id),
GREATEST(sender_id, recipient_id)
) m2
ON LEAST(m1.sender_id, m1.recipient_id) = m2.first AND
GREATEST(m1.sender_id, m1.recipient_id) = m2.second AND
m1.created_at = m2.recent_date
Изход:
Обяснение:
Предизвикателството в тази заявка е да се намери начин за групиране на разговори между двама потребители заедно. Използвах LEAST/GREATEST
трик, който е начин, по който можем да третираме 2 -> 4
и 4 -> 2
разговор като логически едно и също нещо. След това с помощта на GROUP BY
, можем да идентифицираме най-новата дата на разговор за тази двойка разговарящи потребители. Така че подзаявката в моя отговор по-горе намира, за всяка двойка потребители, без да се съобразява с какъвто и да е ред, тази двойка заедно с нейната най-нова дата на разговор. След това присъединяваме този резултат обратно към messages
таблица, за да въведете действителния текст на последното съобщение.
Демо тук: