我希望得到所有不是"更早的记录"超过20天。如果在20天内没有记录,我想要最近一天的所有记录。我这样做:
SELECT COUNT(DISTINCT t.id) FROM t
WHERE
(DATEDIFF(NOW(), t.created) <= 20
OR
(date(t.created) >= (SELECT max(date(created)) FROM t)));
到目前为止,这是有效的,但它很慢。创建是一个日期时间,可能是由于转换为日期...任何想法如何加快这一点?
答案 0 :(得分:0)
SELECT COUNT(*) FROM (
SELECT * FROM t WHERE datediff(now(),created) between 0 and 20
UNION
SELECT * FROM (SELECT * FROM t WHERE created<now() LIMIT 1) last1
) last20d
我使用了between
子句,以防万一以后表中可能有日期。这些将被排除在外。如果只是需要count()
到
SELECT COUNT(*) FROM (
SELECT id FROM t WHERE datediff(now(),created) between 0 and 20
UNION
SELECT id FROM (SELECT id FROM t WHERE created<now() LIMIT 1) last1
) last20d
否则,在第一个选择版本中,如果您想要所选记录的所有数据,则可以省略外部选择。 UNION
将确保排除重复项(在其他情况下,我总是使用UNION ALL
,因为它更快)。