【问题标题】:select data with mysql用mysql选择数据
【发布时间】:2011-05-13 01:46:06
【问题描述】:

例如,如果我有这样的表

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 sql datetime-generation


    【解决方案1】:

    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)
      

      ...为您需要的尽可能多的值。在这种情况下,INSERT 语句至少需要运行 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. 使用 OUTER JOIN 获得所需的输出:

         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
      

    为什么是数字,而不是日期?

    简单 - 可以根据数字生成日期,就像我提供的示例一样。这也意味着使用一个表,而不是每个数据类型一个表。

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多