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.