Đề xuất ban đầu của tôi không chính xác :
SELECT
date, item, SUM(cnt)
FROM (
SELECT
date, item, count(item_id) AS cnt
FROM test_popularity
GROUP BY date, item_id
ORDER BY cnt DESC
) t
GROUP BY date;
Điều này giả định một cách sai lầm rằng tập hợp bên ngoài (theo ngày) sẽ chọn hàng đầu tiên của bảng dẫn xuất bên trong được sắp xếp theo cnt. Trên thực tế, hành vi này là không xác định và không được đảm bảo là nhất quán.
Đây là giải pháp thích hợp:
SELECT
t1.date, t1.item,
(SELECT COUNT(*) FROM test_popularity WHERE date = t1.date) as total
# see note!
FROM test_popularity t1
JOIN (
SELECT date, item, item_id, COUNT(item_id) as count
FROM test_popularity
GROUP BY date, item_id
) AS t2
ON t1.date = t2.date AND t1.item_id = t2.item_id
GROUP BY t1.date;
Lưu ý:
Tôi đã thêm tổng số (SELECT COUNT(*)) AS total
bởi vì câu hỏi yêu cầu điều này trong một truy vấn. Tuy nhiên, điều này sẽ không mở rộng quy mô vì nó là một truy vấn con tương quan. Điều này có nghĩa là cứ mỗi t1.date, truy vấn con SELECT COUNT (*) sẽ chạy. Vui lòng đánh giá điểm chuẩn và xem liệu nó có hoạt động phù hợp với nhu cầu của bạn hay không. Nếu không, thì tôi khuyên bạn nên lấy tổng số hàng ngày trong một truy vấn riêng biệt. Bạn sẽ hợp nhất các kết quả này trong ứng dụng của mình.