MYSQL - 每天的总注册量

时间:2016-06-23 05:15:55

标签: mysql count group-by

我的用户表中有以下结构:

id(INT)    registered(DATETIME)
1          2016-04-01 23:23:01
2          2016-04-02 03:23:02
3          2016-04-02 05:23:03
4          2016-04-03 04:04:04

我希望获得DB中所有日期的每日总(累计)用户数 所以结果应该是

day          total
2016-04-01   1
2016-04-02   3
2016-04-03   4

我尝试了一些子查询,但不知怎的,我现在已经知道如何用可能的1个SQL语句实现这一点。当然,如果可以按天计数并按编程方式添加,但如果可能,我不想这样做。

2 个答案:

答案 0 :(得分:1)

您可以使用完成所有计数的GROUP BY,而无需以编程方式执行任何操作,请查看此查询:

select
  d.dt,
  count(*) as total
from
  (select distinct date(registered) dt from table1) d inner join
  table1 r on d.dt>=date(r.registered)
group by
  d.dt
order by
  d.dt

第一个子查询返回所有不同的日期,然后我们可以加入所有以前注册的所有日期,并在一个查询中进行计数。

可以提供性能改进的替代连接条件是:

on d.dt + interval 1 day > r.registered

答案 1 :(得分:0)

不确定为什么不只使用GROUP BY,没有它,这件事会更复杂,无论如何,试试这个;)

select
    date_format(main.registered, '%Y-%m-%d') as `day`,
    main.total
from (
    select
        table1.*,
        @cnt := @cnt + 1 as total
    from table1
    cross join (select @cnt := 0) t
) main
inner join (
    select
        a.*,
        if(@param = date_format(registered, '%Y-%m-%d'), @rowno := @rowno + 1 ,@rowno := 1) as rowno, 
        @param := date_format(registered, '%Y-%m-%d')
    from (select * from table1 order by registered desc) a
    cross join (select @param := null, @rowno := 0) tmp
    having rowno = 1
) sub on main.id = sub.id

SQLFiddle DEMO