Pokud správně rozumím vašemu požadavku, chcete získat nejnovější datum zprávy pro každou konverzaci s určitým uživatelem. V tomto případě můžeme agregovat konverzace pro daného uživatele a ponechat si nejnovější datum zprávy.
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
Výstup:
Vysvětlení:
Úkolem tohoto dotazu je najít způsob, jak seskupit konverzace mezi dvěma uživateli dohromady. Použil jsem LEAST/GREATEST
trik, což je způsob, jak můžeme zacházet s 2 -> 4
a 4 -> 2
konverzaci jako logicky totéž. Poté pomocí GROUP BY
, můžeme identifikovat poslední datum konverzace pro tuto dvojici konverzujících uživatelů. Takže dílčí dotaz v mé odpovědi výše najde pro každý pár uživatelů, bez ohledu na objednávku, tento pár spolu s posledním datem konverzace. Tento výsledek pak připojíme zpět ke messages
tabulka pro zobrazení aktuálního textu poslední zprávy.
Ukázka zde: