Mysql
 sql >> Base de données >  >> RDS >> Mysql

SQL :grouper par à partir d'une autre table et inverser le résultat

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.