Gee*_*tra 3 mysql sql datetime-generation
我有以下架构.
表投票
+------------------+--------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------------------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| aid | varchar(10) | NO | | | |
| ip | varchar(100) | NO | | | |
| host | varchar(200) | NO | | | |
| timestamp | varchar(20) | NO | | 0000-00-00 00:00:00 | |
| user | tinytext | NO | | NULL | |
| userid | int(10) | NO | | 0 | |
+------------------+--------------+------+-----+---------------------+----------------+
Run Code Online (Sandbox Code Playgroud)
在这里,我希望得到过去7天内每一个援助的计数,其中"0"表示没有选票的日期.timestamp是这里的unix时间戳.
任何帮助都非常感谢.
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;
Run Code Online (Sandbox Code Playgroud)使用以下方法填充表:
INSERT INTO NUMBERS
(id)
VALUES
(NULL)
Run Code Online (Sandbox Code Playgroud)
......根据需要提供尽可能多的价值观.
使用DATE_ADD构建日期列表,根据NUMBERS.id值增加日期.将"2010-01-01"和"2010-01-02"替换为您的相应开始日期和结束日期(但使用相同的格式,YYYY-MM-DD HH:MM:SS).在此示例中,我从CURRENT_DATE中减去了NUMBERS.id值,以获取上周的连续日期值列表 -
SELECT x.dt
FROM (SELECT DATE_SUB(CURRENT_DATE, INTERVAL (n.id - 1) DAY) AS dt
FROM numbers n
WHERE n.id <= 7 ) x
Run Code Online (Sandbox Code Playgroud)LEFT根据日期时间部分加入到您的数据表中.
SELECT x.dt,
COUNT(v.aid) AS num
FROM (SELECT DATE_SUB(CURRENT_DATE, INTERVAL (n.id - 1) DAY) AS dt
FROM numbers n
WHERE n.id <= 7 ) x
LEFT JOIN VOTES v ON DATE(FROM_UNIXTIME(v.timestamp)) = DATE(x.dt)
GROUP BY x.dt
ORDER BY x.dt
Run Code Online (Sandbox Code Playgroud)简单 - 可以根据数字生成日期,就像我提供的示例一样.它还意味着使用单个表,而不是每个数据类型一个.
SELECT DATE(FROM_UNIXTIME(v.timestamp)) AS dt,
COUNT(v.aid)
FROM VOTES v
WHERE DATE(FROM_UNIXTIME(v.timestamp)) BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY)
AND CURRENT_DATE
GROUP BY DATE(FROM_UNIXTIME(v.timestamp))
Run Code Online (Sandbox Code Playgroud)