所以可以说我有一些看起来像:

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 

我想是不可能选择的 缺席 数据的。

有帮助吗?

解决方案

您是对的 - SQL并不容易识别丢失的数据。通常的技术是根据完整的序列加入您的序列(使用差距),并在后一个序列中选择这些元素,而没有数据中的相应伙伴。

所以, @ @benhoffstein的 建议 保持永久约会表是一个很好的表。

除此之外,您可以用一个 整数表. 。假设 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;

其他提示

一种解决方案是创建一个带有一列的单独表格,以保持所有日期,从现在开始(或者当您期望停止博客时)。例如:

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)

从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);

(如果已经存在Thedate,则忽略了不创建错误的关键字(Thedate是主要键))。
然后,您正常插入值

  insert into blog (thedate,thetext) values ($mydate, "newtext") 
  on duplicate key update thetext="newtext";

最后选择空条目,您只需要

  select thedate from blog where thetext is null;

您可能不会喜欢这样:

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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top