sql >> Base de Datos >  >> RDS >> Mysql

SQL:agrupar por de otra tabla e invertir el resultado

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.