2016-04-02 19 views
1

我有一个情况,在这里我需要从过去30天获取数据,并且获取所有日期,即使数据不存在于给定日期的mysql中。如何在MySQL中选择最后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

有没有简单的方法恕我直言。你可能会发现这个有用的,allthough不直接相关:http://stackoverflow.com/questions/1046865/mysql-select-all-dates-in-a-range-even-if-no-records-present – Gogol

+0

如果你的数据没有可用于选择和过滤的信息,则它没有可用于选择和过滤的信息。想象一下,你对数据*关于*的知识一无所知,并且你被要求手动检查它并查找最近30天的记录。你找到没有日期的记录。你是做什么?除非你的教师告诉你如何处理无日期条目,否则你将不得不忽视它们。同样在这里 - 要么说什么需要发生,要么SQL忽略它们。 –

+1

定义'数据不存在于mysql'中 –

回答

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天,在没有条目在table1发现计数0:

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; 
+1

您可以随时使用http://sqlfiddle.com/这是一些数据库,包括MySQL的在线测试:) – Prix

+0

@Prix谢谢很多,我已经用它来修改答案我知道jsfiddle,但不知何故完全错过了phpfiddle和sqlfiddle ... – Guido

+0

@Guido谢谢。我会试试这个。如果我有成千上万的行,这会更好吗?只是想有最好的选择。保持积极。 –