Много просто и бързо в PostgreSQL с DISTINCT ON
- не е стандартен SQL, така че не е наличен във всяка RDBMS.
Въпросът не го споменава, но произлизайки от примерите за код, той всъщност търси реда с „последната дата“ за всеки получател за даден 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
Подробности, както и множество SQL стандартни алтернативи тук:
Избиране на първия ред във всяка група GROUP BY?
Друго решение с основен стандартен SQL. Работи с всяка голяма RDBMS, включително MySQL (тъй като този етикет е добавен):
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
)
Само редът с най-новата дата преминава NOT EXISTS
анти-полусъединяване.