Mijn eerste suggestie was onjuist :
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;
Dit veronderstelt ten onrechte dat de buitenste aggregatie (op datum) de eerste rij van de binnenste afgeleide tabel selecteert die is geordend op cnt. Dit gedrag is in feite ongedefinieerd en niet gegarandeerd consistent.
Hier is de juiste oplossing:
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;
Opmerking:
Ik heb de (SELECT COUNT(*)) AS total
. toegevoegd omdat de vraag hier in één query om vroeg. Dit wordt echter niet geschaald omdat het een gecorreleerde subquery is. Dit betekent dat voor elke t1.date de subquery SELECT COUNT(*) wordt uitgevoerd. Gelieve te benchmarken en te zien of het geschikt is voor uw behoeften. Zo niet, dan raad ik aan om de dagelijkse totalen in een aparte query te krijgen. U zou deze resultaten samenvoegen in uw aanvraag.