Jika saya memahami kebutuhan Anda dengan benar, Anda ingin mendapatkan tanggal pesan terbaru untuk setiap percakapan yang melibatkan pengguna tertentu. Dalam hal ini, kami dapat menggabungkan percakapan untuk pengguna tertentu dan mempertahankan tanggal pesan terbaru.
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
Keluaran:
Penjelasan:
Tantangan dalam kueri ini adalah menemukan cara untuk mengelompokkan percakapan antara dua pengguna secara bersamaan. Saya menggunakan LEAST/GREATEST
trik, yang merupakan cara kita dapat memperlakukan 2 -> 4
dan 4 -> 2
percakapan sebagai hal yang sama secara logis. Kemudian, menggunakan GROUP BY
, kami dapat mengidentifikasi tanggal percakapan terbaru untuk pasangan pengguna percakapan tersebut. Jadi subquery dalam jawaban saya di atas menemukan, untuk setiap pasangan pengguna, tanpa memperhatikan urutan apa pun, pasangan itu bersama dengan tanggal percakapan terbarunya. Kami kemudian menggabungkan hasil ini kembali ke messages
tabel untuk memasukkan teks pesan terbaru yang sebenarnya.
Demo di sini: