3

我正在尝试构建一个查询,该查询将列出表中的所有用户 ID,这些用户 ID 在过去 90 天内有条目,但在过去 30 天内没有。

该表的超级简化版本将包含三个字段:RecordID(主键,自动增量)、UserID(外键)和 RecordDate(时间戳)。

我知道如何在两个查询中执行此操作,但可以在一个查询中完成吗?它应该返回条目少于 90 天但在过去 30 天内没有条目的任何用户的用户 ID。

4

4 回答 4

1

以下查询应该可以完成这项工作:

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
于 2013-07-10T19:27:08.653 回答
0
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 可以在表中多次出现,但您只希望它们返回一次。因此“与众不同”

于 2013-07-10T19:26:12.457 回答
0

这应该这样做

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
)
于 2013-07-10T19:28:00.220 回答
0
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)
于 2013-07-10T19:29:20.927 回答