【发布时间】:2013-07-08 21:21:46
【问题描述】:
我正在尝试构建一个查询,该查询将列出表中在过去 90 天内但不是在过去 30 天内有条目的所有用户 ID。
一个超级简化版的表格将包含三个字段:RecordID(主键,自动增量)、UserID(外键)和 RecordDate(时间戳)。
我知道如何在两个查询中执行此操作,但可以在一个查询中完成吗?它应该返回任何用户的用户 ID,其条目少于 90 天,但在过去 30 天内没有条目。
【问题讨论】:
标签: mysql
我正在尝试构建一个查询,该查询将列出表中在过去 90 天内但不是在过去 30 天内有条目的所有用户 ID。
一个超级简化版的表格将包含三个字段:RecordID(主键,自动增量)、UserID(外键)和 RecordDate(时间戳)。
我知道如何在两个查询中执行此操作,但可以在一个查询中完成吗?它应该返回任何用户的用户 ID,其条目少于 90 天,但在过去 30 天内没有条目。
【问题讨论】:
标签: mysql
select distinct(userid)
from thetable
where recorddate > DATE_SUB(now(), INTERVAL 90 DAY)
and userid not in
(
select userid
from thetable
where recorddate > DATE_SUB(now(), INTERVAL 30 DAY)
)
我不太了解 mySQL,所以请使用适当的方式检查日期是否在最近 x 天内
我假设一个用户 ID 可以在表中多次出现,但您只希望它们返回一次。因此“与众不同”
【讨论】:
以下查询应该可以完成这项工作:
SELECT UserID
FROM MyTable AS T1
WHERE
(SELECT MIN(DATEDIFF(NOW(),RecordDate))
FROM MyTable AS T2 -- Most recent entry must be more
WHERE T2.UserID=T1.UserId) BETWEEN 31 AND 90 -- than 30 days ago, but no more
-- than 90 days ago
【讨论】:
SELECT UserID
FROM
(
SELECT UserID,
MIN(RecordDate) AS min_date,
MAX(RecordDate) AS max_date
FROM MyTable
GROUP BY UserID
)
WHERE max_date < AddDate(CURRENT_TIMESTAMP, INTERVAL -30 DAY)
AND min_date >= AddDate(CURRENT_TIMESTAMP, INTERVAL -90 DAY)
【讨论】:
应该这样做
SELECT DISTINCT UserID
FROM Table t1
WHERE RecordDate > DATE_SUB(NOW(), INTERVAL 90 DAY)
AND NOT EXISTS (
SELECT 1 FROM Table
WHERE RecordDate > DATE_SUB(NOW(), INTERVAL 30 DAY)
AND UserID = t1.UserID
)
【讨论】: