Mysql
 sql >> Database >  >> RDS >> Mysql

Interrogazione di conversazioni dalla tabella dei messaggi

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:

Rextester