2

我有一个包含以下数据的表:

UserName | LastLogin 
-------------------------------
User1    | 2010-10-25 10:05:47
User2    | 2010-10-23 11:10:27
User3    | 2010-10-12 05:39:34
User4    | 2010-10-20 12:22:11
User5    | 2010-09-17 08:41:05

我希望能够运行查询以获取过去 3 天、过去 7 天和过去 21 天登录的人数(我知道这些数字会重叠)。我知道我可以通过运行如下查询来获取每个特定值(语法可能不是 100% 正确):

SELECT COUNT(*) 
  FROM login 
 WHERE LastLogin >= DATEDIFF(NOW(), LastLogin, INTERVAL 3 DAY);

我可以运行查询以在一个查询中返回所有三个值吗?GROUP BY 会起作用,还是可以使用嵌套查询?以指定的不同时间间隔运行 3 次查询是否同样有效?

4

2 回答 2

7

采用:

SELECT SUM(CASE WHEN l.lastlogin >= DATE_SUB(CURRENT_DATE, INTERVAL 3 DAY) THEN 1 ELSE 0 END) AS within_3,
       SUM(CASE WHEN l.lastlogin >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY) THEN 1 ELSE 0 END) AS within_7,
       SUM(CASE WHEN l.lastlogin >= DATE_SUB(CURRENT_DATE, INTERVAL 21 DAY) THEN 1 ELSE 0 END) AS within_21
  FROM LOGIN l

我使用 CURRENT_DATE 而不是 NOW() 因为 NOW() 包括时间部分。

于 2010-10-25T18:01:56.630 回答
0
SELECT *
FROM   (SELECT COUNT(*) AS Last3Days FROM login WHERE LastLogin >= DATEDIFF(CURRENT_DATE, LastLogin, INTERVAL 3 DAY) a,
       (SELECT COUNT(*) AS Last7Days FROM login WHERE LastLogin >= DATEDIFF(CURRENT_DATE, LastLogin, INTERVAL 7 DAY) b,
       (SELECT COUNT(*) AS Last21Days FROM login WHERE LastLogin >= DATEDIFF(CURRENT_DATE, LastLogin, INTERVAL 21 DAY) c
于 2010-10-25T18:14:14.937 回答