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;