Si je comprends bien votre exigence, vous souhaitez obtenir la date de message la plus récente pour chaque conversation impliquant un certain utilisateur. Dans ce cas, nous pouvons agréger les conversations d'un utilisateur donné et conserver la date du message le plus récent.
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
Sortie :
Explication :
Le défi de cette requête est de trouver un moyen de regrouper les conversations entre deux utilisateurs. J'ai utilisé le LEAST/GREATEST
astuce, qui est une façon de traiter un 2 -> 4
et 4 -> 2
conversation comme étant logiquement la même chose. Ensuite, en utilisant GROUP BY
, nous pouvons identifier la date de conversation la plus récente pour cette paire d'utilisateurs en conversation. Ainsi, la sous-requête dans ma réponse ci-dessus trouve, pour chaque paire d'utilisateurs, sans égard à aucun ordre, cette paire avec sa date de conversation la plus récente. Nous rejoignons ensuite ce résultat aux messages
tableau pour afficher le texte du dernier message réel.
Démo ici :