在过去30天内“单独”选择SUM

时间:2019-11-03 07:02:17

标签: php mysql laravel

我有一个如下的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"));
}

但是我如何才能更有效地实现这一目标? 任何帮助表示赞赏。

2 个答案:

答案 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

Demo on dbfiddle