例如,如果我有一个像这样的表

total   date
10      2010-01-01
15      2010-01-02
98      2010-01-03
50      2010-01-05
.

如何编写SELECT语句以如此获取输出?

total   date
10      2010-01-01
15      2010-01-02
98      2010-01-03
0       2010-01-04
50      2010-01-05
.

有帮助吗?

解决方案

mysql没有递归功能,因此您留下了使用NUMBERS表技巧 -

  1. 创建一个只包含递增数字的表 - 易于使用auto_increment:

    DROP TABLE IF EXISTS `example`.`numbers`;
    CREATE TABLE  `example`.`numbers` (
      `id` int(10) unsigned NOT NULL auto_increment,
       PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    

  2. 使用:填充表格

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    
    .

    ...适用于您需要的数量。在这种情况下,插入语句需要至少运行31次。

  3. 使用date_add 要构建天数,基于NUMBERS.id值的增加:

    SELECT x.dt
      FROM (SELECT DATE(DATE_ADD('2010-01-01', INTERVAL (n.id - 1) DAY)) AS dt
              FROM numbers n
             WHERE DATE_ADD('2010-01-01', INTERVAL (n.id - 1) DAY) <= '2010-01-05' ) x
    

  4. 使用外连接来获得所需的输出:

       SELECT x.dt,
              COUNT(*) AS total
         FROM (SELECT DATE(DATE_ADD('2010-01-01', INTERVAL (n.id - 1) DAY)) AS dt
                 FROM numbers n
                WHERE DATE_ADD('2010-01-01', INTERVAL (n.id - 1) DAY) <= '2010-01-05' ) x
    LEFT JOIN YOUR_TABLE y ON y.date = x.dt
     GROUP BY x.dt
     ORDER BY x.dt
    

    为什么数字,不是日期?

    简单 - 可以基于该号码生成日期,例如在我提供的示例中。它还意味着使用单个表,Vs每数据类型说一个。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top