Muito simples e rápido no PostgreSQL com
DISTINCT ON
- não SQL padrão, portanto, não disponível em todos os RDBMS. A pergunta não menciona isso, mas, decorrente dos exemplos de código, está realmente procurando a linha com a "última data" para cada destinatário para um determinado
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
Detalhes, bem como várias alternativas padrão SQL aqui:
Selecionar a primeira linha em cada grupo GROUP BY?
Outra solução com SQL básico e padrão. Funciona com todos os principais RDBMS, incluindo MySQL (desde que essa tag foi adicionada):
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
)
Somente a linha com a data mais recente passa o
NOT EXISTS
anti-semi-junção.