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

时间:2012-12-06 23:36:57

标签: mysql count group-by

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"

我正在生成要在折线图中显示的数据。不幸的是,我无法弄清楚如何让上面的查询显示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的解决方案。我对该网站进行了很好的搜索,但很难理解其中的一些实现。有什么建议?

3 个答案:

答案 0 :(得分: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

内部查询,我只是加入了没有键的users表,因此它只是用来循环显示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

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

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

答案 1 :(得分:1)

你需要做什么
1.生成日期范围 2.然后选择上面生成的查询中不存在的日期
3.与上面的查询建立联盟。

答案 2 :(得分:1)

它显示了66条记录,只有我已超过120

SELECT AllDaysYouWant.MyJoinDate, count( U.id ) AS NumberJoined FROM (SELECT @curDate := Date_Add( @curDate , INTERVAL 1 DAY ) AS MyJoinDate FROM (SELECT @curDate := '2013-08-03')sqlvars, ipro_user LIMIT 150)AllDaysYouWant LEFT JOIN ipro_user U ON AllDaysYouWant.MyJoinDate = date_format( `date` , '%Y-%m-%d' ) AND U.active=1 GROUP BY AllDaysYouWant.MyJoinDate

查询没有错误,工作正常