所以我想说我有一些看起来像的记录:
2011-01-01 Cat
2011-01-02 Dog
2011-01-04 Horse
2011-01-06 Lion
如何构建将返回2011-01-03和2011-01-05的查询,即未使用的日期。我将博客发布到未来,我想要一个查询,告诉我我没有发布任何东西的日子。它将从当前日期看到未来2周。
更新
我对建立一个永久的约会表并不太兴奋。在考虑之后,虽然看起来似乎解决方案可能是创建一个创建临时表的小存储过程。类似的东西:
CREATE PROCEDURE MISSING_DATES()
BEGIN
CREATE TABLE TEMPORARY DATES (FUTURE DATETIME NULL)
INSERT INTO DATES (FUTURE) VALUES (CURDATE())
INSERT INTO DATES (FUTURE) VALUES (ADDDATE(CURDATE(), INTERVAL 1 DAY))
...
INSERT INTO DATES (FUTURE) VALUES (ADDDATE(CURDATE(), INTERVAL 14 DAY))
SELECT FUTURE FROM DATES WHERE FUTURE NOT IN (SELECT POSTDATE FROM POSTS)
DROP TABLE TEMPORARY DATES
END
我想我们无法选择缺席数据。
答案 0 :(得分:4)
一种解决方案是创建一个包含一列的单独表格,以保存从现在到永久的所有日期(或者当您希望停止博客时)。例如:
CREATE TABLE Dates (dt DATE);
INSERT INTO Dates VALUES ('2011-01-01');
INSERT INTO Dates VALUES ('2011-01-02');
...etc...
INSERT INTO Dates VALUES ('2099-12-31');
设置此参考表后,您可以简单地使用外连接来确定未使用的日期,如下所示:
SELECT d.dt
FROM Dates d LEFT JOIN Blogs b ON d.dt = b.dt
WHERE b.dt IS NULL
如果您希望将搜索限制在将来两周,可以将其添加到WHERE子句中:
AND d.dt BETWEEN NOW() AND ADDDATE(NOW(), INTERVAL 14 DAY)
答案 1 :(得分:4)
你说得对 - SQL不容易识别缺失的数据。通常的技术是将序列(带有间隙)与完整序列连接起来,并在后一序列中选择那些元素,而不需要数据中的相应伙伴。
所以,@ BenHoffstein的suggestion维护一个永久的日期表是一个很好的日期表。
除此之外,您可以使用integers table动态创建该日期范围。假设integers
表的列i
的数字至少为0 - 13,并且您的表的日期列名为datestamp
:
SELECT candidate_date AS missing
FROM (SELECT CURRENT_DATE + INTERVAL i DAY AS candidate_date
FROM integers
WHERE i < 14) AS next_two_weeks
LEFT JOIN my_table ON candidate_date = datestamp
WHERE datestamp is NULL;
答案 2 :(得分:0)
你可能不喜欢这样:
select '2011-01-03', count(*) from TABLE where postdate='2011-01-03'
having count(*)=0 union
select '2011-01-04', count(*) from TABLE where postdate='2011-01-04'
having count(*)=0 union
select '2011-01-05', count(*) from TABLE where postdate='2011-01-05'
having count(*)=0 union
... repeat for 2 weeks
或强>
创建一个包含2011年所有日期的表格,然后执行左连接,例如
select a.days_2011
from all_days_2011
left join TABLE on a.days_2011=TABLE.postdate
where a.days_2011 between date(now()) and date(date_add(now(), interval 2 week))
and TABLE.postdate is null;
答案 3 :(得分:0)
从mysql数据库中提取行的方法是通过SELECT
。因此,您无法选择不存在的行。
我要做的是在博客中填写所有可能的日期(一年,然后重复这个过程)
create table blog (
thedate date not null,
thetext text null,
primary key (thedate));
执行循环以创建2011年的所有日期条目(使用程序,例如$ mydate是您要插入的日期)
insert IGNORE into blog (thedate,thetext) values ($mydate, null);
(如果日期已存在,则IGNORE关键字不会创建错误(日期是主键)。
然后通常插入值
insert into blog (thedate,thetext) values ($mydate, "newtext")
on duplicate key update thetext="newtext";
最后选择空条目,你只需要
select thedate from blog where thetext is null;