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

メッセージテーブルからの会話のクエリ

    要件を正しく理解している場合は、特定のユーザーが関与するすべての会話の最新のメッセージ日付を取得する必要があります。この場合、特定のユーザーの会話を集約して、最新のメッセージ日付を保持できます。

    SELECT m1.*
    FROM messages m1
    INNER JOIN
    (
        SELECT LEAST(sender_id, recipient_id)    AS first,
               GREATEST(sender_id, recipient_id) AS second,
               MAX(created_at) AS recent_date
        FROM messages
        WHERE sender_id = 2 OR recipient_id = 2
        GROUP BY LEAST(sender_id, recipient_id),
                 GREATEST(sender_id, recipient_id)
    ) m2
        ON LEAST(m1.sender_id, m1.recipient_id)    = m2.first AND
           GREATEST(m1.sender_id, m1.recipient_id) = m2.second AND
           m1.created_at = m2.recent_date
    

    出力:

    説明:

    このクエリの課題は、2人のユーザー間の会話をグループ化する方法を見つけることです。 LEAST/GREATESTを使用しました トリック。これは、2 -> 4を処理する方法です。 および4 -> 2 論理的に同じものとしての会話。次に、GROUP BYを使用します 、会話しているユーザーのそのペアの最新の会話日を特定できます。したがって、上記の私の回答のサブクエリは、ユーザーのペアごとに、順序に関係なく、そのペアと最新の会話日を検出します。次に、この結果をmessagesに結合します。 実際の最新のメッセージテキストを取り込むためのテーブル。

    デモはこちら:

    レキスター



    1. ドロップダウンにMySQLエントリを入力する

    2. SQL Serverで「datetimeoffset」を「date」に変換します(T-SQLの例)

    3. Codeigniter:ユーザーがユーザー名を作成するときにユーザーのURLを作成したい

    4. SQLServerにIPアドレスを格納するためのデータ型