PostgreSQLでは非常にシンプルで高速です DISTINCT ON
を使用 -標準SQLではないため、すべてのRDBMSで利用できるわけではありません。
質問にはそれについては触れられていませんが、コード例から導き出されて、実際には、特定の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
詳細と複数のSQL標準の代替案はこちら:
各GROUPBYグループの最初の行を選択しますか?
基本的な標準SQLを使用した別のソリューション。 MySQLを含むすべての主要なRDBMSで動作します (そのタグが追加されているため):
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
)
最新の日付の行のみがNOT EXISTS
を通過します 反半結合。