sql >> Base de Datos >  >> RDS >> Mysql

Consulta de conversaciones desde la tabla de mensajes

Si entiendo correctamente su requisito, desea obtener la fecha del mensaje más reciente para cada conversación que involucre a un determinado usuario. En este caso, podemos agregar más conversaciones para un usuario determinado y conservar la fecha del mensaje más reciente.

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

Salida:

Explicación:

El desafío en esta consulta es encontrar una manera de agrupar conversaciones entre dos usuarios. Usé el LEAST/GREATEST truco, que es una forma en que podemos tratar un 2 -> 4 y 4 -> 2 conversación como siendo lógicamente la misma cosa. Luego, usando GROUP BY , podemos identificar la fecha de conversación más reciente para ese par de usuarios que conversan. Entonces, la subconsulta en mi respuesta anterior encuentra, para cada par de usuarios, sin tener en cuenta ningún orden, ese par junto con su fecha de conversación más reciente. Luego unimos este resultado a los messages tabla para traer el último mensaje de texto real.

Demostración aquí:

Rextester