我正在尝试构建一个查询,该查询将列出表中的所有用户 ID,这些用户 ID 在过去 90 天内有条目,但在过去 30 天内没有。
该表的超级简化版本将包含三个字段:RecordID(主键,自动增量)、UserID(外键)和 RecordDate(时间戳)。
我知道如何在两个查询中执行此操作,但可以在一个查询中完成吗?它应该返回条目少于 90 天但在过去 30 天内没有条目的任何用户的用户 ID。
我正在尝试构建一个查询,该查询将列出表中的所有用户 ID,这些用户 ID 在过去 90 天内有条目,但在过去 30 天内没有。
该表的超级简化版本将包含三个字段:RecordID(主键,自动增量)、UserID(外键)和 RecordDate(时间戳)。
我知道如何在两个查询中执行此操作,但可以在一个查询中完成吗?它应该返回条目少于 90 天但在过去 30 天内没有条目的任何用户的用户 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 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 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
)
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)