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.