Mi sugerencia inicial fue incorrecta :
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;
Esto supone erróneamente que la agregación externa (por fecha) seleccionará la primera fila de la tabla derivada interna que se ordenó por cnt. Este comportamiento es, de hecho, indefinido y no se garantiza que sea consistente.
Aquí está la solución adecuada:
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;
Agregué el (SELECT COUNT(*)) AS total
porque la pregunta pedía esto en una consulta. Sin embargo, esto no escalará ya que es una subconsulta correlacionada. Esto significa que para cada t1.date se ejecutará la subconsulta SELECT COUNT(*). Por favor, compare y vea si funciona adecuadamente para sus necesidades. De lo contrario, sugiero obtener los totales diarios en una consulta separada. Combinaría estos resultados en su aplicación.