私の最初の提案は正しくないでした :
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
を追加しました 質問が1つのクエリでこれを求めたからです。ただし、これは相関サブクエリであるため、スケーリングされません。これは、t1.dateごとにSELECT COUNT(*)サブクエリが実行されることを意味します。ベンチマークを行い、ニーズに適しているかどうかを確認してください。そうでない場合は、別のクエリで1日の合計を取得することをお勧めします。これらの結果をアプリケーションにマージします。