我有一个情况,我需要抓取过去30天的数据,获取所有日期,即使数据在mysql中不存在给定日期。
我当前的查询是这样的。 lastUpdated是一个时间戳列
SELECT Date(a.lastUpdated), count(*)
FROM table1 a
LEFT JOIN table2 b on (a.pgid = b.prod_id)
WHERE Date(lastUpdated) BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE()
GROUP BY Date(a.lastUpdated);
这样的返回结果
Date(a.lastUpdated) count(*)
2016-03-23 1
2016-03-24 14
2016-03-30 65
2016-03-31 1
2016-04-02 1
我的问题是,即使数据不在mysql中,它是否可以列出所有日期。或任何其他解决方法。我使用的是PHP 7.0。
我环顾四周,但没有找到与我的要求相关的任何内容。
答案 0 :(得分:1)
假设一个简化的示例表table1
,其中包含以下内容
CREATE TABLE table1 (lastUpdated datetime);
INSERT INTO table1 (lastUpdated) VALUES ('2016-03-23');
INSERT INTO table1 (lastUpdated) VALUES ('2016-03-24');
INSERT INTO table1 (lastUpdated) VALUES ('2016-03-30');
INSERT INTO table1 (lastUpdated) VALUES ('2016-03-31');
INSERT INTO table1 (lastUpdated) VALUES ('2016-04-02');
INSERT INTO table1 (lastUpdated) VALUES ('2016-03-31');
然后,以下MySQL语句将返回过去30天内的所有日期,计数为0,table1
中未找到任何条目:
SELECT lastUpdated, count(*)-1 FROM (
SELECT date(lastUpdated) as lastUpdated FROM table1 as t1
UNION ALL
SELECT curdate() - interval a day AS lastUpdated FROM (
select 0 as a union select 1 union select 2 union select 3 union
select 4 union select 5 union select 6 union select 7 union
select 8 union select 9 union select 10 union select 11 union
select 12 union select 13 union select 14 union select 15 union
select 16 union select 17 union select 18 union select 19 union
select 20 union select 21 union select 22 union select 23 union
select 24 union select 25 union select 26 union select 27 union
select 28 union select 29
) as t2
) as t3 GROUP BY lastUpdated;