查询中包含范围内所有日期的where子句

时间:2013-06-12 10:20:08

标签: mysql

我需要用最后可用的值来填充缺少的日期,所以我要进行第一步以获取所有日期的查询,包括在每日表上丢失一个日期。我知道有很多关于填充缺失日期的问题,但在这里我需要在该查询的where子句。 人们通常建议在所有日期中制作单独的表,然后使用左连接与其他表来获取所有日期,对于缺少的值,您将获得NULL,这很好。

所以我创建了那个表并将其称为日历,并尝试了这个查询:

SELECT d.`date`, s.`item`, s.state 
FROM calendar d LEFT JOIN daily_states s
ON d.`date` = s.`date`
WHERE s.`item` = 'item1'
ORDER BY s.`date` ASC;

希望我得到结果(example1):

Date        | Item  | State

2013-05-01    item1   state1
2013-05-02    item1   state1
2013-05-03    NULL    NULL
2013-05-04    item1   state3
2013-05-05    NULL    NULL
2013-05-06    item1   state3
2013-05-07    item1   state1

我确定item中的NULL值实际上只是item1但右表中缺少日期。这样我以后可以用之前的状态填充缺少的项目和状态值,并以此结果结束(example2):

2013-05-01    item1   state1
2013-05-02    item1   state1
2013-05-03    item1   state1
2013-05-04    item1   state3
2013-05-05    item1   state3
2013-05-06    item1   state3
2013-05-07    item1   state1

但是由于WHERE子句,我得到了这个(结果):

2013-05-01    item1   state1
2013-05-02    item1   state1
2013-05-04    item1   state3
2013-05-06    item1   state3
2013-05-07    item1   state1

所以我仍然没有错过约会。如何在example1中获得结果? 顺便说一下我用SQLfiddle做了一些例子。 Thx提前!

1 个答案:

答案 0 :(得分:1)

还检索NULL值:

添加

OR s.item IS NULL

where条款中

SELECT d.`date`, s.`item`, s.state 
FROM calendar d LEFT JOIN daily_states s
ON d.`date` = s.`date`
WHERE s.`item` = 'item1' OR s.item IS NULL
ORDER BY d.`date` ASC;

我按d.date排序,而非s.date(可能为空)

SqlFiddle