Sangat sederhana dan cepat dalam PostgreSQL dengan DISTINCT ON
- bukan SQL standar sehingga tidak tersedia di setiap RDBMS.
Pertanyaannya tidak menyebutkannya, tetapi berasal dari contoh kode itu sebenarnya mencari baris dengan "tanggal terakhir" untuk setiap penerima untuk author
yang diberikan .
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
Detail serta beberapa alternatif standar SQL di sini:
Pilih baris pertama di setiap grup GROUP BY?
Solusi lain dengan SQL standar dan dasar. Bekerja dengan setiap RDBMS utama, termasuk MySQL (karena tag itu telah ditambahkan):
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
)
Hanya baris dengan tanggal terbaru yang melewati NOT EXISTS
anti-semi-gabung.