Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL:Nhận thông báo mới nhất từ ​​2 bảng được liên kết với nhau

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)

Xem trên DB Fiddle

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)

Xem trên DB Fiddle

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 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự cố kết nối SQLPro to Vagrant

  2. Gọi thủ tục được lưu trữ với tham số Out bằng PDO

  3. Cập nhật bảng trong một câu lệnh chọn

  4. Không thể kết nối với MySQL và thực hiện các hoạt động trong Play Framework 2.4

  5. Tải dữ liệu trong tệp giá trị mặc định không chèn trong bảng