Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL:gruppiere nach aus anderer Tabelle und invertiere das Ergebnis

Sehr einfach und schnell in PostgreSQL mit DISTINCT ON - kein Standard-SQL, daher nicht in jedem RDBMS verfügbar.

Die Frage erwähnt es nicht, aber ausgehend von den Codebeispielen sucht es tatsächlich nach der Zeile mit dem "letzten Datum" für jeden Empfänger für einen bestimmten 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

Details sowie mehrere SQL-Standardalternativen hier:
Erste Zeile in jeder GROUP BY-Gruppe auswählen?

Eine weitere Lösung mit einfachem Standard-SQL. Funktioniert mit allen wichtigen RDBMS, einschließlich MySQL (da dieses Tag hinzugefügt wurde):

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
   )

Nur die Zeile mit dem spätesten Datum besteht den NOT EXISTS Anti-Semi-Join.