2011-04-02 124 views
3

我已经尝试了几个这样的主题:How to find missing data rows using SQL?这里,但我不能让它在我的情况下工作。如何在mysql表中查找缺失的行(日期)?

我在MySQL中有一个名为posts的表格,我每天都在其中保存用户日志。有时用户会忘记写一天的帖子,我想让他们稍后提交。 所以DB结构是这样的:

date   userid 
2011-10-01  1 
2011-10-02  1 
(missing) 
2011-10-04  1 
2011-10-05  1 
(missing) 
2011-10-07  1 

所以我想表明在这个表中缺少行用户的失踪日期的下拉列表中,这样他就可以选择他想要提交帖子的日期。

我该怎么做? 谢谢。

回答

3

如果你有日期表,这些类型的查询最容易解决。 在您的数据库中,运行此批次作为一次性创建填充日期表。

DROP PROCEDURE IF EXISTS FillDateTable; 

delimiter // 
CREATE PROCEDURE FillDateTable() 
    LANGUAGE SQL 
    NOT DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    COMMENT '' 
BEGIN 
    drop table if exists datetable; 
    create table datetable (thedate datetime primary key, isweekday smallint); 

    SET @x := date('2000-01-01'); 
    REPEAT 
    insert into datetable (thedate, isweekday) SELECT @x, case when dayofweek(@x) in (1,7) then 0 else 1 end; 
    SET @x := date_add(@x, interval 1 day); 
    UNTIL @x >= '2030-12-31' END REPEAT; 
END// 
delimiter ; 

CALL FillDateTable; 

然后,你可以使用普通的LEFT JOIN

SELECT thedate 
FROM datetable 
LEFT JOIN posts on posts.date = datetable.thedate 
WHERE posts.date IS NULL 

当然,你不希望所有的“失踪”,从2000日期2030年限制它的MIN和MAX中的日期职位表(用户),即

SELECT thedate 
FROM datetable 
INNER JOIN (select min(date) postStart, max(date) postEnd 
      FROM posts 
      where userid=123) p on datetable.thedate BETWEEN p.postStart and p.postEnd 
LEFT JOIN posts on posts.date = datetable.thedate 
WHERE posts.date IS NULL 
+0

只是一个问题,空间和性能呢? – Sallar 2011-04-02 11:49:25

+0

@Sallar/Performance很不错。 10,000个日期的空间可以忽略不计。大约100kb? 1MB? (野蛮猜测),但肯定不是很大。 – RichardTheKiwi 2011-04-02 11:52:01

5

找到缺失日期的最简单方法是使用日历表。我已发布code to create and populate a calendar table for PostgreSQL;你应该可以毫不费力地适应它。

随着日历表就位,您的查询非常简单,并且易于理解。要找到2011年10月的缺失日期,您可以使用这些行中的内容。 (在你的“帖子”表上猜测)

select c.cal_date 
from calendar c 
left join posts p on (c.cal_date = p.date) 
where p.date is null 
    and c.cal_date between '2011-10-01' and '2011-10-31' 
    and p.userid = 1 
order by c.cal_date 
1

你可以自动与空头衔,空的内容,但实际日期每次(日结束)输入空职。然后,如果用户想要添加前一天的帖子,则显示所有包含空标题和内容的帖子,并更新他选择的帖子。

这不应该是一个空间问题,不是如果他们写的比他们错过的更多。例如,如果他们写了4天而错过了1.

此外,您将运行脚本并删除空标题,空内容和日期早于X天的条目。如果他们没有在X天添加缺失的帖子,他们可能永远不会这样做。

我很抱歉,如果我的解决方案琐碎/太抽象。

+0

感谢您的回复。我想到了这一点,但有超过2000个用户,他们可能有很多错过的项目。我不喜欢我表中的那些空行:( – Sallar 2011-04-02 11:35:59