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

MySQL:相互に関連付けられている2つのテーブルから最新のメッセージを取得します

    古いバージョンのMySQL(<8.0.2)では、派生テーブル 。派生テーブルでは、最新のsend_datetimeを取得できます。 各conversation_idの値 。 また、WHEREでconversation_idのフィルターを提供できることも注目に値します。 このサブクエリの句。

    次に、このサブクエリの結果セットを使用してメインテーブルに適切に結合し、会話の最新のメッセージに対応する行を取得できます。

    スキーマ(MySQL v5.7)

    DBフィドルで表示

    クエリ#1

    SELECT
      amc.conversation_id, 
      m.message_id, 
      m.message   
    FROM 
      assoc_message__conversation AS amc
    JOIN message AS m 
      ON m.message_id = amc.message_id 
    JOIN 
    (
      SELECT
        amc1.conversation_id, 
        MAX(m1.send_datetime) AS latest_send_datetime
      FROM
       assoc_message__conversation AS amc1
      JOIN message AS m1
        ON m1.message_id = amc1.message_id 
      WHERE amc1.conversation_id IN (1,2)  -- Here you provide your input filters
      GROUP BY amc1.conversation_id
    ) AS dt  
      ON dt.conversation_id = amc.conversation_id AND 
         dt.latest_send_datetime = m.send_datetime;
    

    結果

    | conversation_id | message_id | message        |
    | --------------- | ---------- | -------------- |
    | 1               | 3          | Latest message |
    | 2               | 6          | Latest message |
    

    MySQL 8.0.2以降では、Row_Number()を使用できます。 機能。 conversation_idのパーティション内 、send_datetimeの降順で並べ替えられたすべてのメッセージの行番号を決定します 。 このサブクエリでは、WHEREでconversation_idのフィルタを提供できます 条項。

    次に、この結果セットを派生テーブルとして使用し、行番号の値が1である行のみを検討します(最新のsend_datetimeに属するため) 。

    スキーマ(MySQL v8.0)

    DBフィドルで表示

    クエリ#2

    SELECT 
      dt.conversation_id, 
      dt.message_id, 
      dt.message 
    FROM 
    (
      SELECT
        amc.conversation_id, 
        m.message_id, 
        m.message, 
        ROW_NUMBER() OVER (PARTITION BY amc.conversation_id 
                           ORDER BY m.send_datetime DESC) AS row_no 
      FROM
       assoc_message__conversation AS amc
      JOIN message AS m
        ON m.message_id = amc.message_id 
      WHERE amc.conversation_id IN (1,2)  -- Here you provide your input filters
    ) AS dt  
    WHERE dt.row_no = 1;
    

    結果

    | conversation_id | message_id | message        |
    | --------------- | ---------- | -------------- |
    | 1               | 3          | Latest message |
    | 2               | 6          | Latest message |
    


    1. PostgreSQL:コマンドラインからPostgreSQLデータベースを削除します

    2. クラウドベンダーの詳細:MicrosoftAzure上のPostgreSQL

    3. 列挙型に実際の値より1つ小さい値を追加するMySQLコネクタ

    4. MySQLでGROUPBYを使用して最新の行を選択します