更新:問題は(さまざまな人が指摘しているように)クエリで日時フィールドを日付フィールドに変更しているようです。
使用DATE( all_griefs_tbl.actioned_date
が遅すぎます。actioned_date を日付フィールドに変更したり、日付と時刻フィールドに分割したりせずに、より迅速な方法はありますか?
私は 2 つのテーブルを持っています。1 つはステータスと日時フィールドを持つ多数のレコードを含み、もう 1 つは 2008 年から 2015 年の日付を持つカレンダー テーブルです。
私が取得したいのは、期間内のすべての日付と、毎日「受け入れられた」レコードの数です-その数がゼロであっても-これは次のようになります:
| Date | number_accepted |
----------------------------
2012-03-01 723
2012-03-02 723
2012-03-03 1055
2012-03-04 1069
2012-03-05 0
2012-03-06 615
2012-03-07 0
2012-03-08 1072
2012-03-09 664
2012-03-10 859
2012-03-11 0
2012-03-12 778
2012-03-13 987
私は次のことを試しましたが、データの小さなサンプル (-1000 行) で十分な速度しかありません。少なくとも60万行でうまく機能するものが必要です
SELECT calendar.datefield AS Date,
COUNT( all_griefs_tbl.actioned_status ) AS total_griefs
FROM all_griefs_tbl
RIGHT JOIN calendar
ON ( DATE( all_griefs_tbl.actioned_date ) = calendar.datefield )
AND all_griefs_tbl.actioned_status = 'accepted'
WHERE calendar.datefield < CURDATE( )
GROUP BY calendar.datefield
ありがとう
編集:要求された実行計画
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE calendar range PRIMARY PRIMARY 3 NULL 1576 Using where; Using index
1 SIMPLE all_griefs_tbl ref actioned_status actioned_status 153 const 294975