Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SQL:agrupar por outra tabela e inverter o resultado


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.