Muy simple y rápido en PostgreSQL con DISTINCT ON
- no es SQL estándar, por lo que no está disponible en todos los RDBMS.
La pregunta no lo menciona, pero derivado de los ejemplos de código, en realidad está buscando la fila con la "última fecha" para cada destinatario para un author
dado. .
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
Detalles, así como múltiples alternativas estándar de SQL aquí:
¿Seleccionar la primera fila en cada grupo GROUP BY?
Otra solución con SQL básico y estándar. Funciona con todos los principales RDBMS, incluido MySQL (ya que se ha agregado esa etiqueta):
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
)
Solo la fila con la última fecha pasa el NOT EXISTS
anti-semi-unión.