Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Konversationen aus der Nachrichtentabelle abfragen

Wenn ich Ihre Anforderung richtig verstehe, möchten Sie das letzte Nachrichtendatum für jede Konversation mit einem bestimmten Benutzer erhalten. In diesem Fall können wir Konversationen für einen bestimmten Benutzer aggregieren und das neueste Nachrichtendatum beibehalten.

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

Ausgabe:

Erklärung:

Die Herausforderung bei dieser Abfrage besteht darin, einen Weg zu finden, Konversationen zwischen zwei Benutzern zusammen zu gruppieren. Ich habe den LEAST/GREATEST verwendet Trick, mit dem wir eine 2 -> 4 behandeln können und 4 -> 2 Konversation als logisch dasselbe. Verwenden Sie dann GROUP BY , können wir das letzte Gesprächsdatum für dieses Paar sich unterhaltender Benutzer identifizieren. Die Unterabfrage in meiner obigen Antwort findet also für jedes Benutzerpaar ohne Berücksichtigung der Reihenfolge dieses Paar zusammen mit dem letzten Gesprächsdatum. Wir verbinden dieses Ergebnis dann wieder mit den messages Tabelle, um den aktuellsten Nachrichtentext einzufügen.

Demo hier:

Rextester