Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 给定日期范围内活动用户的每日计数_Mysql - Fatal编程技术网

Mysql 给定日期范围内活动用户的每日计数

Mysql 给定日期范围内活动用户的每日计数,mysql,Mysql,我需要根据开始日期和结束日期查找每日活动用户总数 登记表 id registration_no start_date end_date 1 1000 2014/12/01 2014/12/03 2 1001 2014/12/01 2014/12/03 3 1002 2014/12/02 2014/12/04 4 1003 2014/12/02 2014/12/04 5

我需要根据开始日期和结束日期查找每日活动用户总数

登记表

id  registration_no  start_date  end_date
1   1000             2014/12/01  2014/12/03
2   1001             2014/12/01  2014/12/03
3   1002             2014/12/02  2014/12/04
4   1003             2014/12/02  2014/12/04
5   1004             2014/12/02  2014/12/04
6   1005             2014/12/03  2014/12/05
7   1006             2014/12/05  2014/12/06
8   1007             2014/12/05  2014/12/09
9   1008             2014/12/06  2014/12/10
10  1009             2014/12/07  2014/12/11
结果应采用以下格式

Date        Active Users
2014-12-01  2
2014-12-02  5
2014-12-03  6
2014-12-04  4
2014-12-05  3
2014-12-06  3
2014-12-07  3
2014-12-08  3
2014-12-09  3
2014-12-10  2
2014-12-11  1
2014-12-12  0
我知道以下查询不起作用

SELECT start_date, count(*) FROM registration
WHERE start_date >= '2014/12/01' AND end_date <='2014/12/12'
GROUP BY start_date

任何帮助都将不胜感激。

试试看。。。。根据评论,请注意2014-12-02的条件

SELECT DATE_FORMAT(start_date,'%Y-%m-%d')as Date, count(*) as ActiveUser FROM registration
WHERE (start_date >= '2014/12/02' AND end_date <='2014/12/02')
GROUP BY start_date

您需要创建包含所有所需天数的日历,然后使用如下查询:

SELECT calDay as `Date`, count(id) as `Active Users`
FROM   (SELECT cast('2014-12-01' + interval `day` day as date) calDay
        FROM   days31
        WHERE  cast('2014-12-01' + interval `day` day as date) < '2014-12-12') calendar
LEFT JOIN registration on (calDay between start_date and end_date)
GROUP BY calDay
ORDER BY calDay;

您可以看到它在这里工作,其中days31只是一个整数为0-30的视图。这允许查询在31天内的任何日历中工作。您可以向视图中添加更多的天数,也可以使用交叉联接动态生成这些天数。看

我觉得不错。尝试不使用分组方式的简单选择。您是否获得了预期的记录?使用我的查询将获得以下结果:2014-12-01 2 2014-12-02 3 2014-12-03 1 2014-12-05 2 2014-12-06 1 2014-12-07 1您收到的结果是我对您的查询的预期结果。当您按开始日期分组时,实际上是告诉它每个唯一的开始日期返回一行。不确定如何在原始sql中获得所需的答案。简单的方法是查询数据库中的每个日期,但这可能会影响性能。我正在寻找一种解决方案,它可能只利用一个数据库查询的子查询或联合。此查询与我的查询类似,但没有给出所需的结果。请查看我的最新问题。您能告诉我您期望的标准是什么吗?2014-12-01 2 2014-12-02 5 2014-12-03 6 2014-12-04 4 2014-12-05 3 2014-12-06 3 2014-12-07 3 2014-12-08 3 2014-12-09 3 2014-12-10 2 2014-12-11 1 2014-12-12 0在2014-12-02以下用户处于活动状态:1000、1001、1002、1003、,1004作为“2014-12-02”>=开始日期和2014-12-02,您的解决方案没有提供所需的输出。这真是太棒了!很好用。非常感谢@koriander。
SELECT calDay as `Date`, count(id) as `Active Users`
FROM   (SELECT cast('2014-12-01' + interval `day` day as date) calDay
        FROM   days31
        WHERE  cast('2014-12-01' + interval `day` day as date) < '2014-12-12') calendar
LEFT JOIN registration on (calDay between start_date and end_date)
GROUP BY calDay
ORDER BY calDay;