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: