ID 1
のユーザーを想定 および3
、フィドルで行ったように、最新のcreated_at
のメッセージに関心があります および(sender_id, receiver_id)
(1,3)
であること または(3,1)
。
アドホック行タイプを使用して、構文を短くすることができます:
SELECT *
FROM messages
WHERE (sender_id, receiver_id) IN ((1,3), (3,1))
ORDER BY created_at DESC
LIMIT 1;
または明示的に(そしてわずかに高速で、インデックスでの使用も簡単です):
SELECT *
FROM messages
WHERE (sender_id = 1 AND receiver_id = 3 OR
sender_id = 3 AND receiver_id = 1)
ORDER BY created_at DESC
LIMIT 1;
すべての場合 ユーザーの会話
コメントのリクエストに従って解決策を追加しました。
SELECT DISTINCT ON (user_id) *
FROM (
SELECT 'out' AS type, id, receiver_id AS user_id, body, created_at
FROM messages
WHERE sender_id = 1
UNION ALL
SELECT 'in' AS type, id, sender_id AS user_id, body, created_at
FROM messages
WHERE receiver_id = 1
) sub
ORDER BY user_id, created_at DESC;
ここでのアプローチは、最後の行の抽出を簡素化するために、外部の送信者/受信者を1つの列に折りたたむことです。
DISTINCT ON
の詳細な説明 この関連する回答:
各GROUP BYグループの最初の行を選択しますか?
フィドルの改善され簡素化されたテストケースも検討してください。