选择在过去30天内和过去7天内在一个有效查询中注册的用户

时间:2010-07-28 20:41:38

标签: sql mysql

我有这个查询,用于选择过去30天内用户注册的数量:

SELECT
  COUNT(*) AS UserCount30
FROM
  User
WHERE
  User.UserDateCreated > (CURDATE() - INTERVAL 30 DAY)

然后我有这个查询,选择过去7天内注册的用户数

SELECT
  COUNT(*) AS UserCount7
FROM
  User
WHERE
  User.UserDateCreated > (CURDATE() - INTERVAL 7 DAY)

理想情况下,这些都将成为一个更大的查询的一部分。如何在一个有效查询中获得这两个值,最好不使用子查询。

3 个答案:

答案 0 :(得分:6)

拉30天并计算(*)。然后做一个总和,并且总和中的expr有if语句如果在7天内返回1,如果不是则返回0。

SELECT COUNT(*) AS UserCount30, 
       SUM(if((CURDATE() - INTERVAL 7 DAY) < User.UserDateCreated) 1 else 0)
  FROM USER
 WHERE User.UserDateCreated > (CURDATE() - INTERVAL 30 DAY)

答案 1 :(得分:0)

为什么不使用子查询?因为'所有子查询都很慢'神话?

下面

SELECT
 u1.cnt AS UserCount30,
 u2.cnt AS UserCount7
FROM (SELECT
  COUNT(*) AS cnt
FROM
  User
WHERE
  User.UserDateCreated > (CURDATE() - INTERVAL 30 DAY)
) AS c1
CROSS JOIN (SELECT
  COUNT(*) AS cnt
FROM
  User
WHERE
  User.UserDateCreated > (CURDATE() - INTERVAL 7 DAY)
) AS c2

答案 2 :(得分:0)

SELECT 
   SUM(if((CURDATE() - INTERVAL 30 DAY)< User.UserDateCreated) 1 else 0) AS Last30, 
   SUM(if((CURDATE() - INTERVAL 7 DAY)< User.UserDateCreated) 1 else 0) AS Last7
FROM 
   USER

我喜欢coffeepac的答案,但只是稍微改变了一下(更容易阅读/理解它是这样做的,恕我直言)。

我不是mySQL的人,但有一点我要小心的是,如果UserDateCreated是一个像Sql-Server一样的“日期/时间”字段。在这种情况下,最好在执行逻辑(&lt;,&gt;,=,...)比较之前消除时间。