如果你有日期表,这些类型的查询最容易解决。 在您的数据库中,运行此批次作为一次性创建填充日期表。
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
只是一个问题,空间和性能呢? – Sallar 2011-04-02 11:49:25
@Sallar/Performance很不错。 10,000个日期的空间可以忽略不计。大约100kb? 1MB? (野蛮猜测),但肯定不是很大。 – RichardTheKiwi 2011-04-02 11:52:01