Bardzo prosty i szybki w PostgreSQL z DISTINCT ON
- nie standardowy SQL, więc nie jest dostępny w każdym RDBMS.
Pytanie nie wspomina o tym, ale wywodząc się z przykładów kodu, faktycznie szuka wiersza z "ostatnią datą" dla każdego odbiorcy dla danego 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
Szczegóły, a także wiele standardowych alternatyw SQL tutaj:
Wybrać pierwszy wiersz w każdej grupie GROUP BY?
Kolejne rozwiązanie z podstawowym, standardowym SQL. Działa z każdym głównym RDBMS, w tym MySQL (odkąd ten tag został dodany):
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
)
Tylko wiersz z najnowszą datą przechodzi NOT EXISTS
anty-semi-join.