Di versi MySQL yang lebih lama (<8.0.2), kita dapat menggunakan Tabel Turunan
. Dalam tabel Derived, kita bisa mendapatkan send_datetime
terbaru nilai untuk setiap conversation_id
. Selain itu, perlu diperhatikan bahwa Anda dapat menyediakan filter untuk percakapan_id di WHERE
klausa subkueri ini.
Kami kemudian dapat menggunakan kumpulan hasil subquery ini dan bergabung kembali ke tabel utama dengan tepat, untuk mendapatkan baris yang sesuai dengan pesan terbaru dalam percakapan.
Skema (MySQL v5.7)
Kueri #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;
Hasil
| conversation_id | message_id | message |
| --------------- | ---------- | -------------- |
| 1 | 3 | Latest message |
| 2 | 6 | Latest message |
Di MySQL 8.0.2 dan di atasnya, kita bisa menggunakan Row_Number()
Kegunaan. Dalam partisi conversation_id
, kami akan menentukan Nomor Baris untuk setiap pesan, diurutkan dalam urutan send_datetime
. Dalam subkueri ini, Anda dapat memberikan filter untuk percakapan_id di WHERE
klausa.
Kami kemudian akan menggunakan kumpulan hasil ini sebagai Tabel Turunan, dan hanya mempertimbangkan baris tersebut, di mana nilai Nomor Baris adalah 1 (karena akan menjadi milik send_datetime
terbaru ).
Skema (MySQL v8.0)
Kueri #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;
Hasil
| conversation_id | message_id | message |
| --------------- | ---------- | -------------- |
| 1 | 3 | Latest message |
| 2 | 6 | Latest message |