更新:似乎问题(如各种人所述)是将日期时间字段更改为查询中的日期字段。
使用DATE( all_griefs_tbl.actioned_date
太慢,有没有更快的方法,既不将 actioned_date 更改为日期字段,也不将其拆分为日期和时间字段?
我有 2 个表,一个包含大量记录,其中包含状态和日期时间字段,另一个是日期从 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 行)上足够快。我需要在至少 600k 行上运行良好的东西
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