Trong các phiên bản MySQL cũ hơn (<8.0.2), chúng ta có thể sử dụng Bảng có nguồn gốc
. Trong bảng Derived, chúng ta có thể lấy send_datetime
mới nhất giá trị cho mỗi conversation_id
. Ngoài ra, cần lưu ý rằng bạn có thể cung cấp bộ lọc của mình cho speech_id trong WHERE
mệnh đề của truy vấn con này.
Sau đó, chúng tôi có thể sử dụng tập kết quả của truy vấn con này và kết hợp trở lại các bảng chính một cách thích hợp, để lấy hàng tương ứng với thông báo mới nhất trong một cuộc hội thoại.
Giản đồ (MySQL v5.7)
Truy vấn số 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;
Kết quả
| conversation_id | message_id | message |
| --------------- | ---------- | -------------- |
| 1 | 3 | Latest message |
| 2 | 6 | Latest message |
Trong MySQL 8.0.2 trở lên, chúng ta có thể sử dụng Row_Number()
chức năng. Trong một phân vùng của conversation_id
, chúng tôi sẽ xác định Số hàng cho mọi thư, được sắp xếp theo thứ tự giảm dần của send_datetime
. Trong truy vấn con này, bạn có thể cung cấp bộ lọc của mình cho speech_id trong WHERE
mệnh đề.
Sau đó, chúng tôi sẽ sử dụng tập kết quả này làm Bảng gốc và chỉ xem xét những hàng đó, trong đó giá trị Số hàng là 1 (vì nó sẽ thuộc về send_datetime
mới nhất ).
Giản đồ (MySQL v8.0)
Truy vấn số 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;
Kết quả
| conversation_id | message_id | message |
| --------------- | ---------- | -------------- |
| 1 | 3 | Latest message |
| 2 | 6 | Latest message |