Velmi jednoduché a rychlé v PostgreSQL s DISTINCT ON
- není standardní SQL, takže není k dispozici v každém RDBMS.
Otázka to nezmiňuje, ale na základě příkladů kódu ve skutečnosti hledá řádek s "posledním datem" pro každého příjemce pro daného 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
Podrobnosti a několik standardních alternativ SQL zde:
Vybrat první řádek v každé skupině GROUP BY?
Další řešení se základním, standardním SQL. Funguje se všemi hlavními RDBMS, včetně MySQL (od té doby, co byla tato značka přidána):
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
)
Hodnotu NOT EXISTS
projde pouze řádek s nejnovějším datem anti-semi-join.