我有这个查询,用于选择过去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)
理想情况下,这些都将成为一个更大的查询的一部分。如何在一个有效查询中获得这两个值,最好不使用子查询。
答案 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;,=,...)比较之前消除时间。