Mycket enkelt och snabbt i PostgreSQL med DISTINCT ON
- inte standard SQL så inte tillgänglig i alla RDBMS.
Frågan nämner det inte, men utifrån kodexemplen letar den faktiskt efter raden med "senaste datum" för varje mottagare för en given författare
.
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
Detaljer samt flera SQL-standardalternativ här:
Välj första raden i varje GROUP BY-grupp?
En annan lösning med grundläggande, standard SQL. Fungerar med alla större RDBMS, inklusive MySQL (eftersom den taggen har lagts till):
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
)
Endast raden med det senaste datumet passerar