Se ho compreso correttamente la tua richiesta, desideri ottenere la data del messaggio più recente per ogni conversazione che coinvolge un determinato utente. In questo caso, possiamo aggregare le conversazioni per un determinato utente e conservare la data del messaggio più recente.
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
Risultato:
Spiegazione:
La sfida in questa query è trovare un modo per raggruppare le conversazioni tra due utenti insieme. Ho usato il LEAST/GREATEST
trucco, che è un modo in cui possiamo trattare un 2 -> 4
e 4 -> 2
conversazione come logicamente la stessa cosa. Quindi, utilizzando GROUP BY
, possiamo identificare la data di conversazione più recente per quella coppia di utenti in conversazione. Quindi la sottoquery nella mia risposta sopra trova, per ogni coppia di utenti, indipendentemente dall'ordine, quella coppia insieme alla data di conversazione più recente. Quindi uniamo questo risultato ai messages
tabella per inserire l'ultimo testo del messaggio effettivo.
Demo qui: