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

Đặt hàng Chọn dựa trên kết quả tham gia (Sắp xếp cuộc trò chuyện theo tin nhắn cuối cùng được gửi)

Sự cố là do phần mở rộng dành riêng cho MySQL đối với hành vi của GROUP BY mệnh đề. Các cơ sở dữ liệu khác sẽ gặp lỗi ... một cái gì đó tương tự như trên tổng hợp trong danh sách CHỌN ". (Chúng tôi có thể yêu cầu MySQL đưa ra một lỗi tương tự, nếu chúng tôi bao gồm ONLY_FULL_GROUP_BY trong sql_mode.)

Sự cố với biểu thức messages.created là giá trị đề cập đến một giá trị từ một hàng không xác định trong GROUP BY. Hoạt động ORDER BY xảy ra muộn hơn nhiều trong quá trình xử lý, sau hoạt động GROUP BY.

Để nhận thông tin "mới nhất" được tạo cho mỗi nhóm, hãy sử dụng tổng hợp biểu thức MAX(messages.created) .

Để nhận các giá trị khác từ cùng hàng đó, phức tạp hơn một chút.

Giả sử rằng created duy nhất trong một conversation_id nhất định nhóm (hoặc, nếu không có gì đảm bảo rằng nó không phải là duy nhất và bạn có thể trả lại nhiều hàng có cùng giá trị cho created ...

Để tải created mới nhất cho mỗi conversation_id

SELECT lm.conversation_id
     , MAX(lm.created) AS created
  FROM conversation lc
  JOIN message lm
    ON lm.conversation_id = lc.id
 WHERE (lc.creator_id = :userId OR lc.to_id = :userId)
 GROUP BY lm.conversation_id

Bạn có thể sử dụng nó làm chế độ xem nội tuyến, để lấy toàn bộ hàng với created mới nhất đó

SELECT c.*
     , m.*
  FROM ( SELECT lm.conversation_id
              , MAX(lm.created) AS created
           FROM conversation lc
           JOIN message lm
             ON lm.conversation_id = lc.id
          WHERE (lc.creator_id = :userId OR lc.to_id = :userId)
          GROUP BY lm.conversation_id
       ) l
  JOIN conversation c
    ON c.id = l.conversation_id
  JOIN messages m
    ON m.conversation_id = l.conversation_id
   AND m.created         = l.created
 WHERE (c.creator_id = :userId OR c.to_id = :userId)

LƯU Ý:

Bạn có thể thêm ORDER BY mệnh đề để sắp xếp các hàng được trả về theo cách bạn cần.

WHERE mệnh đề trên truy vấn bên ngoài có thể là thừa và không cần thiết.

Chúng tôi muốn tránh sử dụng SELECT * và muốn liệt kê rõ ràng các biểu thức được trả về.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhân bản GROUP_CONCAT cho gấu trúc.DataFrame

  2. MySQL:Lỗi khi thả cơ sở dữ liệu (errno 13; errno 17; errno 39)

  3. SQL:Làm cách nào tôi có thể cập nhật một giá trị trên một cột chỉ khi giá trị đó là null?

  4. Thứ tự ngẫu nhiên nhất quán trong một truy vấn MySQL

  5. Làm cách nào để tăng tốc quá trình xử lý cơ sở dữ liệu?