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

Nhóm MySQL theo và tối đa trả về các hàng sai

Tôi gặp phải vấn đề này mọi lúc. Khi MySQL chạy một hàm tổng hợp, đối với bất kỳ cột không được tổng hợp nào, nó chỉ cần lấy dữ liệu đầu tiên mà nó chạy qua cho nhóm đó, cho dù nó có từ hàng MAX hay không. Vì vậy, những gì bạn phải làm là sắp xếp dữ liệu trong một truy vấn bên trong sao cho các giá trị tối đa đầu tiên trong nhóm của chúng. Xem liệu điều này có phù hợp với bạn không:

SELECT t.post_id,
       t.profile_id,
       t.score,
       t.pubdate_utc
FROM (SELECT p.profile_id,
             p.post_id,
             p.pubdate_utc,
             (pp.comments + pp.likes + pp.favorites) score
      FROM posts p
      JOIN posts_points pp ON p.post_id = pp.post_id
      WHERE p.pubdate_utc >= DATE_ADD(DATE(NOW()), INTERVAL -17 DAY)
      ORDER BY score DESC
     ) t
GROUP BY DATE(t.pubdate_utc) DESC
;

Lưu ý rằng tôi không sử dụng hàm MAX ở đây. Sắp xếp theo điểm giảm dần và sau đó nhóm theo ngày trong truy vấn bên ngoài sẽ kéo điểm cao nhất theo ngày. Cũng lưu ý rằng tôi đặt mệnh đề WHERE trong truy vấn bên trong. Các truy vấn bên trong như thế này (đôi khi cần thiết) không hiệu quả lắm, vì chúng không có chỉ mục nào cho truy vấn bên ngoài để tối ưu hóa, vì vậy hãy đảm bảo tập kết quả bên trong của bạn càng nhỏ càng tốt. Cuối cùng, hãy lưu ý đến NHÓM THEO NGÀY (t.pubdate_utc). Nếu tôi không giảm nó xuống chỉ thông tin ngày tháng, sẽ có hơn 18 kết quả, vì thời gian cũng được tính sau đó.

Chỉnh sửa:Đã thay đổi thành INTERVAL -17 DAY cho đến 18 kết quả thay vì 19.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giải pháp thay thế cho cột được tạo trong MySQL 5.6 là gì

  2. MySQL ISNULL () Giải thích

  3. Không thể cấu hình cài đặt máy chủ MySQL

  4. MySQL:Lấy các cột theo mức độ ưu tiên Giá trị

  5. Tôi có thể dựa vào câu lệnh using để đóng các kết nối MySQL của mình không?