我有一个如下的MySQL表
------------------------------------------------
| id | user_id | day | value |
| INT(11) | INT(11) | INT(8) | DECIMAL(5,2) |
------------------------------------------------
日期是这样的(Ymd)数字:20191012
我想在今天和过去29天SUM(value)
(根据天列为30天)中获取separately
我想到了这样的循环
for($i=0;$i<=30;$i++)
{
$query = "SELECT SUM(value) FROM table WHERE day=".date('Ymd', strtotime("-{$i} days"));
}
但是我如何才能更有效地实现这一目标? 任何帮助表示赞赏。
答案 0 :(得分:1)
您可以使用Group By通过单个MySQL查询来获取它
SELECT day, SUM(value) FROM table GROUP BY day WHERE day >= ".date('Ymd', strtotime("-29 days"));
它应该起作用,因为您的day
字段是一个数字,并且每天都会增加,因此您可以将其与gte进行比较
预期输出为
---------------------------
| day | SUM(value) |
| INT(8) | |
---------------------------
| 20191012 | 15.25 |
---------------------------
| 20191011 | 29.13 |
---------------------------
| ... | ... |
---------------------------
J4I:如果数据集中有几天没有值,则输出中还会缺少缺少的“天行”,因此结果行可能少于30。
答案 1 :(得分:1)
此查询适用于任何版本的MySQL。它会创建一个临时数字表,其数字范围为0-29,然后使用该表来计算从今天到29天之前的天数列表。然后将其LEFT JOIN
存入数据表以计算每天的总和,对于给定的一天没有数据的总和为0:
SELECT d.day, COALESCE(SUM(value), 0)
FROM (SELECT DATE_FORMAT(CURDATE() -INTERVAL n10.n * 10 + n.n DAY, '%Y%m%d') AS day
FROM (SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) n
CROSS JOIN (SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2) n10) d
LEFT JOIN `table` t ON t.day = d.day
GROUP BY d.day