Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-获取过去1天、7天和30天的聚合,并允许将记录计数到多个组中_Mysql_Sql - Fatal编程技术网

MySQL-获取过去1天、7天和30天的聚合,并允许将记录计数到多个组中

MySQL-获取过去1天、7天和30天的聚合,并允许将记录计数到多个组中,mysql,sql,Mysql,Sql,我有一个包含以下数据的表格: 我希望将这些行分为以下几行: 在最后一天内,过去24小时内的一切 在过去7天内,上周内的所有事项 在过去30天内,上个月内 上述行的最终结果如下所示: 我现在可以将记录分组到以下括号中: SELECT (CASE WHEN created_at = CURDATE() THEN '1 Day' WHEN created_at >= CURDATE() - INTERVAL 6 DAY THEN '7 Days'

我有一个包含以下数据的表格:

我希望将这些行分为以下几行:

在最后一天内,过去24小时内的一切 在过去7天内,上周内的所有事项 在过去30天内,上个月内 上述行的最终结果如下所示:

我现在可以将记录分组到以下括号中:

SELECT (CASE WHEN created_at = CURDATE() THEN '1 Day'
             WHEN created_at >= CURDATE() - INTERVAL 6 DAY THEN '7 Days'
             WHEN created_at >= CURDATE() - INTERVAL 29 DAY THEN '30 Days'
        END) AS Timeframe, COUNT(*) AS Count
FROM my_table
GROUP BY (CASE WHEN created_at = CURDATE() THEN '1 Day'
               WHEN created_at >= CURDATE() - INTERVAL 6 DAY THEN '7 Days'
               WHEN created_at >= CURDATE() - INTERVAL 29 DAY THEN'30 Days'
          END)
但这将防止单个记录被多次计数。例如,第一张图片中的第2行和第3行需要在所有三个括号中计算1天、7天和30天,而第6行到第9行只需要在30天括号中计算


如何使用MySQL实现这一点?

最简单的方法是将其作为列而不是行:

SELECT SUM(created_at = CURDATE()) as today
       SUM(created_at >= CURDATE() - INTERVAL 6 DAY) as last_7_days,
       SUM(created_at >= CURDATE() - INTERVAL 29 DAY) as last_30_days,
       SUM(created_at < CURDATE() - INTERVAL 29 DAY) as older
FROM my_table;

如果您希望将响应分为几行,而不是一行几列,请以@Gordon Linoff作为起点。。。但是一次执行一行查询的效率不高,因为您访问表4次而不是1次!:

-- Row for the 1 day timeframe
SELECT '1 Day' AS `Timeframe`, SUM(created_at = CURDATE()) AS `Count`
FROM my_table

UNION

-- Row for the 7 days timeframe...
SELECT '7 Days' AS `Timeframe`, SUM(created_at >= CURDATE() - INTERVAL 6 DAY) AS `Count`
FROM my_table

UNION

SELECT '30 Days' AS `Timeframe`, SUM(created_at >= CURDATE() - INTERVAL 29 DAY) AS `Count`
FROM my_table

UNION

SELECT 'Older' AS `Timeframe`, SUM(created_at < CURDATE() - INTERVAL 29 DAY) AS `Count`
FROM my_table ;
在这两种情况下,您将从2017-07-25获得:

Timeframe | today :-------- | ----: 1 Day | 0 7 Days | 4 30 Days | 8 Older | 0
dbfiddle

一个UNION ALL语句就可以了。但Gordon的解决方案比较短。这是可行的,但无论如何要以行格式获得它?我使用它作为一个多方面的过滤器,我有一个ORM,它是用来处理每一个单独的组作为一行 Timeframe | today :-------- | ----: 1 Day | 0 7 Days | 4 30 Days | 8 Older | 0