Als ik uw eis goed begrijp, wilt u de meest recente berichtdatum voor elk gesprek met een bepaalde gebruiker. In dit geval kunnen we conversaties voor een bepaalde gebruiker samenvoegen en de meest recente berichtdatum behouden.
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
Uitvoer:
Uitleg:
De uitdaging in deze query is om een manier te vinden om gesprekken tussen twee gebruikers samen te groeperen. Ik gebruikte de LEAST/GREATEST
truc, dat is een manier waarop we een 2 -> 4
. kunnen behandelen en 4 -> 2
gesprek als logisch hetzelfde. Gebruik vervolgens GROUP BY
, kunnen we de meest recente gespreksdatum voor dat paar converserende gebruikers identificeren. Dus de subquery in mijn antwoord hierboven vindt voor elk paar gebruikers, ongeacht de volgorde, dat paar samen met de meest recente gespreksdatum. We voegen dit resultaat vervolgens weer toe aan de messages
tabel om de actuele tekst van het laatste bericht in te voeren.
Demo hier: