Meget enkel og hurtig i PostgreSQL med DISTINCT ON
- ikke standard SQL, så ikke tilgængelig i alle RDBMS.
Spørgsmålet nævner det ikke, men ud fra kodeeksemplerne leder det faktisk efter rækken med "sidste dato" for hver modtager for en given 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
Detaljer samt flere SQL-standardalternativer her:
Vælg første række i hver GROUP BY-gruppe?
Endnu en løsning med grundlæggende, standard SQL. Virker med alle større RDBMS, inklusive MySQL (siden det tag er blevet tilføjet):
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
)
Kun rækken med den seneste dato passerer NOT EXISTS
anti-semi-join.