Nếu tôi hiểu đúng yêu cầu của bạn, bạn muốn nhận được ngày tin nhắn gần đây nhất cho mọi cuộc trò chuyện liên quan đến một người dùng nhất định. Trong trường hợp này, chúng tôi có thể tổng hợp các cuộc hội thoại cho một người dùng nhất định và giữ lại ngày gửi tin nhắn gần đây nhất.
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
Đầu ra:
Giải thích:
Thách thức trong truy vấn này là tìm cách nhóm các cuộc trò chuyện giữa hai người dùng với nhau. Tôi đã sử dụng LEAST/GREATEST
thủ thuật, đó là cách mà chúng ta có thể xử lý 2 -> 4
và 4 -> 2
cuộc trò chuyện về mặt logic giống nhau. Sau đó, sử dụng GROUP BY
, chúng tôi có thể xác định ngày trò chuyện gần đây nhất cho cặp người dùng trò chuyện đó. Vì vậy, truy vấn con trong câu trả lời của tôi ở trên tìm thấy, đối với mỗi cặp người dùng, không phân biệt thứ tự nào, cặp đó cùng với ngày trò chuyện gần đây nhất của nó. Sau đó, chúng tôi nối kết quả này lại với messages
để hiển thị văn bản tin nhắn mới nhất thực tế.
Demo tại đây: