使用单个查询获取每个多个日期间隔的条目数

时间:2016-08-01 05:19:29

标签: mysql sql mariadb

SELECT COUNT(*) FROM `table` WHERE `datetime` > SUBDATE(NOW(), INTERVAL 1 DAY)

这将获得最后一天的参赛作品数量。但是,是否有可能获得多个区间的条目数而无需多次发送此查询的变体(INTERVAL 1 DAYINTERVAL 1 WEEKINTERVAL 1 MONTH,...)?

1 个答案:

答案 0 :(得分:2)

您需要 CASE WHEN 表达式才能实现这一目标。

SELECT
    COUNT(CASE WHEN DATE(`datetime`) >= CURDATE() - INTERVAL 1 DAY AND DATE(`datetime`) < CURDATE() THEN 1 END) AS lastDay,
    COUNT(CASE WHEN DATE(`datetime`) >= CURDATE() - INTERVAL 7 DAY AND DATE(`datetime`) < CURDATE() THEN 1 END ) AS lastSevenDays,
    COUNT(*) AS lastThirtyDays
FROM `table`
WHERE   
DATE(`datetime`) >= CURDATE() - INTERVAL 30 DAY

How to use CASE WHEN expression

注意:如果您的要求是获取最后一天,过去7天和过去30天的结果,请使用此查询。

编辑:

如果您在datetime字段上有索引,则上述查询将无法使用该索引。请使用下面给出的查询,以便使用datetime上的索引。

SELECT
    COUNT(CASE WHEN DATE(`datetime`) >= CURDATE() - INTERVAL 1 DAY AND DATE(`datetime`) < CURDATE() THEN 1 END) AS lastDay,
    COUNT(CASE WHEN DATE(`datetime`) >= CURDATE() - INTERVAL 7 DAY AND DATE(`datetime`) < CURDATE() THEN 1 END ) AS lastSevenDays,
    COUNT(*) AS lastThirtyDays
FROM `table`
WHERE   
`datetime` >= (NOW() - INTERVAL 30 DAY - INTERVAL HOUR(NOW()) HOUR - INTERVAL MINUTE(NOW()) MINUTE - INTERVAL SECOND(NOW()) SECOND)