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í: