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.