Hvis jeg forstår dit krav korrekt, ønsker du at få den seneste beskeddato for hver samtale, der involverer en bestemt bruger. I dette tilfælde kan vi samle samtaler for en given bruger og beholde den seneste beskeddato.
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
Output:
Forklaring:
Udfordringen i denne forespørgsel er at finde en måde at gruppere samtaler mellem to brugere sammen. Jeg brugte LEAST/GREATEST
trick, som er en måde, hvorpå vi kan behandle en 2 -> 4
og 4 -> 2
samtale som logisk set det samme. Brug derefter GROUP BY
, kan vi identificere den seneste samtaledato for det par samtalende brugere. Så underforespørgslen i mit svar ovenfor finder, for hvert par brugere, uden hensyntagen til nogen rækkefølge, dette par sammen med dets seneste samtaledato. Vi føjer derefter dette resultat tilbage til messages
tabel for at hente den faktiske seneste beskedtekst.
Demo her: