Tôi nghĩ rằng truy vấn của bạn đang tạo ra kết quả “phù hợp”, như thể bạn muốn xem thông báo cuối cùng trong một số cuộc hội thoại, bạn thực sự nên nhóm theo conversation_id
. Tôi không thấy trường này của bạn trong lược đồ.
Nếu bạn làm WHERE sender_id = 3 GROUP BY receiver_id
, thì đúng rồi, truy vấn đó trả về cho bạn thông báo 1 và 7, vì những thư đó đã được gửi đến người khác mọi người, do đó trong thiết kế của bạn, họ là những cuộc trò chuyện khác nhau.
Nếu bạn chỉ muốn xem tin nhắn cuối cùng do bạn gửi nói chung, chỉ cần xóa GROUP BY
trong phần thứ hai của UNION
của bạn . Nếu không, hãy xem xét thiết kế lại giản đồ của bạn.
CHỈNH SỬA:
Hãy thử truy vấn này:
SELECT m.message_id, u.username, m.subject, m.message,
m.status, UNIX_TIMESTAMP(m.date) as `date`
FROM users u
LEFT JOIN messages m ON m.sender_id = u.id
WHERE m.message_id IN (
SELECT max(message_id)
FROM messages
WHERE receiver_id = 3 OR sender_id = 3
GROUP BY least(sender_id,receiver_id),
greatest(sender_id,receiver_id)
);
Một số lưu ý:
-
UNION
không cần thiết nữa; - Cách tiếp cận này sẽ coi tất cả các e-mail giữa 2 bên là một cuộc trò chuyện duy nhất, điều này không phải lúc nào cũng đúng. Bạn có thể muốn thiết kế lại phương pháp này;
- Sử dụng các từ dành riêng (như
date
là một phong cách tồi ) đối với tên hoặc bí danh của cột, hãy cố gắng tránh điều này. Hoặc sử dụng que tính ngược nếu bạn sử dụng chúng.