古いバージョンのMySQL(<8.0.2)では、派生テーブル
。派生テーブルでは、最新のsend_datetime
を取得できます。 各conversation_id
の値 。 また、WHERE
でconversation_idのフィルターを提供できることも注目に値します。 このサブクエリの句。
次に、このサブクエリの結果セットを使用してメインテーブルに適切に結合し、会話の最新のメッセージに対応する行を取得できます。
スキーマ(MySQL v5.7)
クエリ#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)
クエリ#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 |