【问题标题】: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 表技巧 -
-
创建一个只包含递增数字的表 - 使用 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;
-
使用以下方法填充表:
INSERT INTO NUMBERS
(id)
VALUES
(NULL)
...为您需要的尽可能多的值。在这种情况下,INSERT 语句至少需要运行 31 次。
-
使用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
-
使用 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
为什么是数字,而不是日期?
简单 - 可以根据数字生成日期,就像我提供的示例一样。这也意味着使用一个表,而不是每个数据类型一个表。