Първоначалното ми предложение беше неправилно :
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;
Това погрешно предполага, че външното агрегиране (по дата) ще избере първия ред от вътрешната извлечена таблица, която е подредена от cnt. Това поведение всъщност е недефинирано и не е гарантирано, че ще бъде последователно.
Ето правилното решение:
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;
Забележка:
Добавих (SELECT COUNT(*)) AS total
защото въпросът е зададен за това в една заявка. Това обаче няма да се мащабира, тъй като е свързана подзаявка. Това означава, че за всяка t1.date ще се изпълнява подзаявката SELECT COUNT(*). Моля, направете сравнение и вижте дали работи подходящо за вашите нужди. Ако не, тогава предлагам да получите дневните суми в отделна заявка. Ще обедините тези резултати във вашето приложение.