即使没有记录,也获取最近 7 天的计数

Get last 7 days count even when there are no records

我如何进行 SQL 查询 returns 我像

---------------------   
|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个都没有记录?

一个解决方案是创建一个包含您需要的所有日期的日历table。然后你可以将它加入你的数据以获得你想要的

您需要构建一个虚拟日期 table 并加入您当前的 table 反对它。

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

请注意,我将空值替换为零。

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

你需要一个table的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

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

        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)

最后,从天数列表开始,让我们向其中加入该摘要。

 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 具有内置的虚拟 table 基数序列,例如 seq_0_to_6。这样方便。