显示所有日期,即使没有结果

use*_*978 13 mysql group-by count

SELECT User_JoinDate, 
COUNT(User_ID) 
FROM Users WHERE `User_JoinDate` 
BETWEEN '2012-11-22' AND '2012-12-06' 
GROUP BY User_JoinDate 
ORDER BY User_JoinDate ASC"
Run Code Online (Sandbox Code Playgroud)

我正在生成要在折线图中显示的数据.不幸的是,我无法弄清楚如何让上面的查询显示0没有用户可能已经注册的日期.所以目前我的输出可能是这样的:

2012-11-22 - 2
2012-11-25 - 4

但我想要的是

2012-11-22 - 2
2012-11-23 - 0
2012-11-24 - 0
2012-11-25 - 4

我目前有一个工作版本,它将MySQL结果存储到一个数组中,然后PHP循环并填充空白.这看起来非常混乱,我希望有一个通过MySQL的解决方案.我对该网站进行了很好的搜索,但很难理解其中的一些实现.有什么建议?

DRa*_*app 11

您可以使用MySQL变量为所需的所有日期构建自动结果集.

select
      AllDaysYouWant.MyJoinDate,
      count( U.User_ID ) as NumberJoined
   from
      ( select
              @curDate := Date_Add(@curDate, interval 1 day) as MyJoinDate
           from
              ( select @curDate := '2012-11-21' ) sqlvars,
              Users
           limit 18 ) AllDaysYouWant
      LEFT JOIN Users U
         on AllDaysYouWant.MyJoinDate = U.User_JoinDate
   group by
      AllDaysYouWant.MyJoinDate
Run Code Online (Sandbox Code Playgroud)

内部查询,我只是加入了没有键的用户表,所以它只是用来循环通过X个记录来表示你想要的日期...这可能是30,100,无论如何......只要表(在这种情况下是用户),就有尽可能多的记录.

那么,除了days之外的其他结果都加入了users表,但这一次,基于用户的JOIN_DATE.简单的COUNT()可以得到你想要的.

"AllDaysYouWant"是分配给内部第一部分查询的别名

  ( select
          @curDate := Date_Add(@curDate, interval 1 day) as MyJoinDate
       from
          ( select @curDate := '2012-11-21' ) sqlvars,
          Users
       limit 18 ) AllDaysYouWant
Run Code Online (Sandbox Code Playgroud)

这基本上说明......从用户表(但可以是任何),给我18行数据(通过限制,但几乎可以是任意数量的记录,但你只需要从11月22日到12月6日,这只是14天,但我做了18只是为了原则它几乎可以是任何东西.在Users表上方是(选择@curDate:='2012-11-21')sqlvars.查询中的任何select语句包含在括号中作为a必须给表源提供一个别名,因为它只是一个我将要使用的变量,不关心它的名字是什么.所以,这个查询在11月21日启动变量并选择@curDate:= Date_Add ...... blah blah表示要获取@curDate的当前值,添加1天(现在变成11月22日)并将其存储在返回的行"MyJoinDate"中.所以现在,这个内部查询创建了从11月22日开始的日期表转发18天的数据,并为其余的查询提供别名"AllDaysYouWant".

我已经调整了你可能遇到的查询,alias.field所有内容都要澄清......