Sql 在一次高效查询中选择过去30天和7天内注册的用户
我的查询选择了过去30天内的用户注册数:Sql 在一次高效查询中选择过去30天和7天内注册的用户,sql,mysql,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() - INTER
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)
理想情况下,这些都将成为一个更大查询的一部分。如何在一个最好不使用子查询的高效查询中获得这两个值。为什么不使用子查询?因为“所有子查询都很慢”的神话 这里
为什么不使用子查询?因为“所有子查询都很慢”的神话 这里
做30天的拉,然后数一数。然后做一个sum,因为expr in sum有一个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)
做30天的拉,然后数一数。然后做一个sum,因为expr in sum有一个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)
我喜欢coffeepac的答案,但改变了一点,更容易阅读/理解它这样做的原因,IMHO
我不是一个mySQL的家伙,但我要小心的一件事是,如果UserDateCreated是一个像SQLServer使用的日期/时间字段。在这种情况下,最好在执行逻辑,=,。。。比较
我喜欢coffeepac的答案,但改变了一点,更容易阅读/理解它这样做的原因,IMHO
我不是一个mySQL的家伙,但我要小心的一件事是,如果UserDateCreated是一个像SQLServer使用的日期/时间字段。在这种情况下,最好在执行逻辑,=,。。。比较。我认为您将过去7天内注册的用户视为过去30天内注册的用户的子集?“你想把他们都算进去吗?”戴夫当然想。在过去7天内注册的用户也是在过去30天内注册的用户。我认为您将在过去7天内注册的用户视为在过去30天内注册的用户的子集?“你想把他们都算进去吗?”戴夫当然想。在过去7天内注册的用户也是在过去30天内注册的用户。在本例中,最近7天的用户不算两次吗?也就是说,他们是在过去30天内和过去7天内注册的。是的-我用@bball验证了这一点-任何在过去7天内注册的用户都应该在这两个计数中。在这一个计数中,最后7个不会被计数两次吗?也就是说,他们是在过去30天内和过去7天内注册的。是的-我用@bball验证了这一点-任何在过去7天内注册的用户都应该在这两个计数中。
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