Très simple et rapide dans PostgreSQL avec DISTINCT ON
- pas de SQL standard donc pas disponible dans tous les RDBMS.
La question ne le mentionne pas, mais d'après les exemples de code, elle recherche en fait la ligne avec la "dernière date" pour chaque destinataire pour un author
donné .
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
Détails ainsi que plusieurs alternatives standard SQL ici :
Sélectionner la première ligne de chaque groupe GROUP BY ?
Une autre solution avec SQL standard de base. Fonctionne avec tous les principaux SGBDR, y compris MySQL (depuis que cette balise a été ajoutée) :
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
)
Seule la ligne avec la dernière date passe le NOT EXISTS
anti-semi-jointure.