Heel eenvoudig en snel in PostgreSQL met DISTINCT ON
- geen standaard SQL, dus niet beschikbaar in elk RDBMS.
De vraag vermeldt het niet, maar afgeleid van de codevoorbeelden zoekt het eigenlijk naar de rij met de "laatste datum" voor elke ontvanger voor een bepaalde author
.
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
Details en meerdere standaard SQL-alternatieven hier:
Selecteer de eerste rij in elke GROUP BY-groep?
Een andere oplossing met basis, standaard SQL. Werkt met alle grote RDBMS, inclusief MySQL (sinds die tag is toegevoegd):
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
)
Alleen de rij met de laatste datum passeert de NOT EXISTS
anti-semi-join.