Mysql
 sql >> Database >  >> RDS >> Mysql

SQL:raggruppa per da un'altra tabella e inverti il ​​risultato

Molto semplice e veloce in PostgreSQL con DISTINCT ON - SQL non standard, quindi non disponibile in tutti gli RDBMS.

La domanda non ne fa menzione, ma derivando dagli esempi di codice in realtà sta cercando la riga con l'"ultima data" per ogni destinatario per un dato 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

Dettagli e più alternative standard SQL qui:
Selezionare la prima riga in ogni gruppo GROUP BY?

Un'altra soluzione con SQL standard di base. Funziona con tutti i principali RDBMS, incluso MySQL (dal momento che quel tag è stato aggiunto):

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 riga con l'ultima data supera il NOT EXISTS anti-semi-unione.