即使没有记录,也要计算最近7天的数量

时间:2015-01-28 13:05:41

标签: mysql sql laravel-4 aggregate-functions

如何创建一个返回类似

的SQL查询
---------------------   
|DATE       | Count |   
---------------------   
|2015/01/07 |  7    |   
|2015/01/06 |  0    |   
|2015/01/05 |  8    |   
|2015/01/04 |  5    |   
|2015/01/03 |  0    |   
|2015/01/02 |  4    |   
|2015/01/01 |  2    |         
---------------------   

第6和第3时没有记录?

4 个答案:

答案 0 :(得分:3)

您需要一个包含0到6之间所有序列号的表。这很容易在简单查询中生成,如下所示。

           SELECT 0 AS seq 
             UNION ALL SELECT 1  UNION ALL SELECT 2 
             UNION ALL SELECT 3  UNION ALL SELECT 4
             UNION ALL SELECT 5  UNION ALL SELECT 6

接下来,让我们用它来构建一个包含七个日期的虚拟表。对于这个例子,我们今天和前六天选择。

        SELECT DATE(NOW())-INTERVAL seq.seq DAY theday   
          FROM (
                   SELECT 0 AS seq 
                     UNION ALL SELECT 1  UNION ALL SELECT 2 
                     UNION ALL SELECT 3  UNION ALL SELECT 4
                     UNION ALL SELECT 5  UNION ALL SELECT 6
                ) seq 

然后执行摘要查询。你没有确切地说它是怎么回事,所以我猜。这个给你从六天前到今天的记录。今天仍在进行中。

        SELECT DATE(i.item_time) theday
               COUNT(*) `count`
          FROM items i
          WHERE i.item_time >= DATE(NOW()) - INTERVAL 6 DAYS
         GROUP BY DATE(i.item_time)

最后,从日期列表开始,让我们将摘要加入LEFT JOIN。

 SELECT thedays.theday, IFNULL(summary.`count`,0) `count`
   FROM (
        SELECT DATE(NOW())-INTERVAL seq.seq DAY theday   
          FROM (
                   SELECT 0 AS seq 
                     UNION ALL SELECT 1  UNION ALL SELECT 2 
                     UNION ALL SELECT 3  UNION ALL SELECT 4
                     UNION ALL SELECT 5  UNION ALL SELECT 6
                ) seq 
          ) thedays
   LEFT JOIN (
        SELECT DATE(i.item_time) theday
               COUNT(*) `count`
          FROM items i
          WHERE i.item_time >= DATE(NOW()) - INTERVAL 6 DAYS
         GROUP BY DATE(i.item_time)
       ) summary USING (theday)
   ORDER BY thedays.theday

它看起来很复杂,但它只是三个基本查询的组合。把它想象成一个三明治,面包和奶酪和番茄粘在一起ORDER BY牙签。

这是一篇更全面的文章。 http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/

MariaDB版本10具有内置的基数序列虚拟表,如seq_0_to_6。这很方便。

答案 1 :(得分:2)

您需要构建一个虚拟日期表,并将当前表连接起来。

SELECT dummy.date, SUM(IFNULL(yourtable.record,0)) recordcount
FROM dummy
LEFT JOIN yourtable on dummy.date=yourtable.date
GROUP BT dummy.date

请注意我用零替换空值。

答案 2 :(得分:1)

一种解决方案是创建一个包含所需日期的日历表。然后,您可以将其加入您的数据,以获得您的目标

答案 3 :(得分:1)

首先,你必须使用左连接,使用IFNULL函数将NULL转换为0。尝试匹配您的表并使用左连接。