我需要用最后可用的值来填充缺少的日期,所以我要进行第一步以获取所有日期的查询,包括在每日表上丢失一个日期。我知道有很多关于填充缺失日期的问题,但在这里我需要在该查询的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提前!
答案 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
(可能为空)