我的用户表中有以下结构:
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语句实现这一点。当然,如果可以按天计数并按编程方式添加,但如果可能,我不想这样做。
答案 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