为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL:即使没有记录,也选择范围内的所有日期

/ 猿问

MySQL:即使没有记录,也选择范围内的所有日期

慕姐8265434 2019-09-06 07:05:27

MySQL:即使没有记录,也选择范围内的所有日期

我有一个用户数据库。我想基于用户群增长创建一个图表。我现在的查询是:


SELECT DATE(datecreated), count(*) AS number FROM users 

WHERE DATE(datecreated) > '2009-06-21' AND DATE(datecreated) <= DATE(NOW())

GROUP BY DATE(datecreated) ORDER BY datecreated ASC

这几乎返回了我想要的东西。如果我们有一天获得0个用户,则该日期不会返回为0值,只会跳过该值,并且会返回至少有一个用户的第二天。我怎样才能得到类似的东西(伪造的反应):


date1 5

date2 8

date3 0

date4 0

date5 9

etc...

零日期与其他日期按顺序显示?


谢谢!


查看完整描述

3 回答

?
慕桂英546537

我希望你能弄明白其余的。

select  * from (select date_add('2003-01-01 00:00:00.000', INTERVAL n5.num*10000+n4.num*1000+n3.num*100+n2.num*10+n1.num DAY ) as date from(select 0 as num   union all select 1
   union all select 2
   union all select 3
   union all select 4
   union all select 5
   union all select 6
   union all select 7
   union all select 8
   union all select 9) n1,(select 0 as num   union all select 1
   union all select 2
   union all select 3
   union all select 4
   union all select 5
   union all select 6
   union all select 7
   union all select 8
   union all select 9) n2,(select 0 as num   union all select 1
   union all select 2
   union all select 3
   union all select 4
   union all select 5
   union all select 6
   union all select 7
   union all select 8
   union all select 9) n3,(select 0 as num   union all select 1
   union all select 2
   union all select 3
   union all select 4
   union all select 5
   union all select 6
   union all select 7
   union all select 8
   union all select 9) n4,(select 0 as num   union all select 1
   union all select 2
   union all select 3
   union all select 4
   union all select 5
   union all select 6
   union all select 7
   union all select 8
   union all select 9) n5) awhere date >'2011-01-02 00:00:00.000' and date < NOW()order by date

select n3.num*100+n2.num*10+n1.num as date

你会得到一个数字从0到最大(n3)* 100 +最大(n2)* 10 +最大(n1)的列

由于这里我们将max n3设为3,SELECT将返回399,加上0 - > 400条记录(日历中的日期)。

您可以通过限制它来调整动态日历,例如,从现在的最小(日期)()。



查看完整回答
反对 回复 2019-09-16
?
达令说

这样做更好:

-- 7 Days:set @n:=date(now() + interval 1 day);SELECT qb.day_series as days , COALESCE(col_byte, 0) as Bytes from tbl1 qa    right join (
        select (select @n:= @n - interval 1 day) day_series from tbl1 limit 7 ) as qb 
    on date(qa.Timestamp) = qb.day_series and qa.Timestamp > DATE_SUB(curdate(), INTERVAL 7 day) order by qb.day_series asc-- 30 Days:set @n:=date(now() + interval 1 day);SELECT qb.day_series as days , COALESCE(col_byte, 0) as Bytes from tbl1 qa    right join (
        select (select @n:= @n - interval 1 day) day_series from tbl1 limit 30 ) as qb 
    on date(qa.Timestamp) = qb.day_series and qa.Timestamp > DATE_SUB(curdate(), INTERVAL 30 day) order by qb.day_series asc;

或者没有像这样的变量:

SELECT qb.day_series as days , COALESCE(col_byte, 0) as Bytes from tbl1 qaright join (
    select curdate() - INTERVAL a.a day as day_series from(
        select 0 as a union all select 1 union all select 2 union all 
        select 3 union all select 4 union all 
        select 5 union all select 6 union all select 7
    ) as a ) as qbon date(qa.Timestamp) = qb.day_series andqa.Timestamp > DATE_SUB(curdate(), INTERVAL 7 day) order by qb.day_series asc;



查看完整回答
反对 回复 2019-09-16
?
慕桂英3389331

这个问题问我想的是同样的事情。一般来说,接受的答案似乎是你要么在你的应用程序逻辑中读取(读入你在数组中的内容,然后遍历数组并创建缺少的日期),或者使用填充了你希望的日期的临时表加入。


查看完整回答
反对 回复 2019-09-16

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信