Rất đơn giản và nhanh chóng trong PostgreSQL với DISTINCT ON
- không phải là SQL tiêu chuẩn nên không có sẵn trong mọi RDBMS.
Câu hỏi không đề cập đến nó, nhưng dựa trên các ví dụ mã, nó thực sự đang tìm kiếm hàng có "ngày cuối cùng" cho mỗi người nhận cho một author
nhất định .
SELECT DISTINCT ON (r.recipient) m.*
FROM message m
JOIN recipient r ON r.m_id = m.id
WHERE m.author = 1
ORDER BY r.recipient, m.date DESC, r.m_id -- to break ties
Thông tin chi tiết cũng như nhiều lựa chọn thay thế chuẩn SQL tại đây:
Chọn hàng đầu tiên trong mỗi GROUP BY nhóm?
Một giải pháp khác với SQL cơ bản, tiêu chuẩn. Hoạt động với mọi RDBMS chính, bao gồm cả MySQL (vì thẻ đó đã được thêm vào):
SELECT m.*
FROM message m
JOIN recipient r ON r.m_id = m.id
WHERE m.author = 1
AND NOT EXISTS (
SELECT 1
FROM message m1
JOIN recipient r1 ON r1.m_id = m1.id
WHERE r1.recipient = r.recipient
AND m1.author = 1
AND m1.date > m.date
)
Chỉ hàng có ngày mới nhất vượt qua NOT EXISTS
chống bán tham gia.