Jeśli dobrze rozumiem Twoje wymagania, chcesz uzyskać najnowszą datę wiadomości dla każdej rozmowy z określonym użytkownikiem. W takim przypadku możemy agregować konwersacje dla danego użytkownika i zachować najnowszą datę wiadomości.
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
Wyjście:
Wyjaśnienie:
Wyzwaniem w tym zapytaniu jest znalezienie sposobu na grupowanie rozmów między dwoma użytkownikami razem. Użyłem LEAST/GREATEST
trik, czyli sposób, w jaki możemy potraktować 2 -> 4
i 4 -> 2
rozmowa jest logicznie tym samym. Następnie, używając GROUP BY
, możemy określić datę ostatniej rozmowy dla tej pary konwersujących użytkowników. Tak więc podzapytanie w mojej odpowiedzi powyżej znajduje dla każdej pary użytkowników, bez względu na kolejność, tę parę wraz z datą ostatniej rozmowy. Następnie dołączamy ten wynik z powrotem do messages
tabela, aby wprowadzić aktualny tekst ostatniej wiadomości.
Demo tutaj: