sql >> データベース >  >> RDS >> PostgreSQL

SQLで特定のユーザーの各会話で最新のメッセージを取得するにはどうすればよいですか?

    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グループの最初の行を選択しますか?

    ->SQLfiddleを更新

    フィドルの改善され簡素化されたテストケースも検討してください。



    1. クエリを使用して既存のテーブルのSQL作成スクリプトを生成する

    2. Oracleにsp_getapplock、sp_releaseapplockに相当するものはありますか?

    3. Hibernate:MySQLDialectとMySQLInnoDBDialectの違いは何ですか?

    4. ArrayListは同じデータを繰り返します