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

Truy vấn các cuộc hội thoại từ bảng tin nhắn

Nếu tôi hiểu đúng yêu cầu của bạn, bạn muốn nhận được ngày tin nhắn gần đây nhất cho mọi cuộc trò chuyện liên quan đến một người dùng nhất định. Trong trường hợp này, chúng tôi có thể tổng hợp các cuộc hội thoại cho một người dùng nhất định và giữ lại ngày gửi tin nhắn gần đây nhất.

SELECT m1.*
FROM messages m1
INNER JOIN
(
    SELECT LEAST(sender_id, recipient_id)    AS first,
           GREATEST(sender_id, recipient_id) AS second,
           MAX(created_at) AS recent_date
    FROM messages
    WHERE sender_id = 2 OR recipient_id = 2
    GROUP BY LEAST(sender_id, recipient_id),
             GREATEST(sender_id, recipient_id)
) m2
    ON LEAST(m1.sender_id, m1.recipient_id)    = m2.first AND
       GREATEST(m1.sender_id, m1.recipient_id) = m2.second AND
       m1.created_at = m2.recent_date

Đầu ra:

Giải thích:

Thách thức trong truy vấn này là tìm cách nhóm các cuộc trò chuyện giữa hai người dùng với nhau. Tôi đã sử dụng LEAST/GREATEST thủ thuật, đó là cách mà chúng ta có thể xử lý 2 -> 44 -> 2 cuộc trò chuyện về mặt logic giống nhau. Sau đó, sử dụng GROUP BY , chúng tôi có thể xác định ngày trò chuyện gần đây nhất cho cặp người dùng trò chuyện đó. Vì vậy, truy vấn con trong câu trả lời của tôi ở trên tìm thấy, đối với mỗi cặp người dùng, không phân biệt thứ tự nào, cặp đó cùng với ngày trò chuyện gần đây nhất của nó. Sau đó, chúng tôi nối kết quả này lại với messages để hiển thị văn bản tin nhắn mới nhất thực tế.

Demo tại đây:

Trình sắp xếp lại



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySql.ConnectorNET.Data so với MySql.Data

  2. làm thế nào để tránh bế tắc trong mysql

  3. ngăn chặn việc chèn hàng trùng lặp trong php / mysql

  4. Hộp kiểm biểu mẫu PHP và chỉ mục không xác định

  5. ADDDATE () so với DATE_ADD () trong MySQL:Sự khác biệt là gì?