Om jag förstår ditt krav korrekt vill du få det senaste meddelandedatumet för varje konversation som involverar en viss användare. I det här fallet kan vi sammanställa konversationer för en viss användare och behålla det senaste meddelandedatumet.
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
Utdata:
Förklaring:
Utmaningen i den här frågan är att hitta ett sätt att gruppera konversationer mellan två användare tillsammans. Jag använde LEAST/GREATEST
trick, vilket är ett sätt som vi kan behandla en 2 -> 4
och 4 -> 2
konversation som logiskt sett är samma sak. Använd sedan GROUP BY
, kan vi identifiera det senaste konversationsdatumet för det paret av konverserande användare. Så underfrågan i mitt svar ovan hittar, för varje par användare, utan hänsyn till någon ordning, det paret tillsammans med dess senaste konversationsdatum. Vi sammanfogar sedan detta resultat tillbaka till messages
tabell för att få in den senaste meddelandetexten.
Demo här: