Mysql
 sql >> Base de données >  >> RDS >> Mysql

Interroger les conversations à partir du tableau des messages

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 :

Rextester