14
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 有一个解决方案。我对该站点进行了很好的搜索,但很难理解其中的一些实现。有什么建议么?

4

3 回答 3

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 等等......只是只要一个表(在这种情况下是用户),就有你期望的尽可能多的记录。

那么,只有天数的结果被加入到用户表中,但这一次,基于用户的 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 天,原则上它几乎可以是任何东西。在用户表上方是 (select @curDate := '2012-11-21') sqlvars。查询中的任何选择语句都用括号括起来作为表源必须有一个别名,因为它只是我将使用的一个变量,所以不要关心它的名字是什么。因此,此查询在 11 月 21 日开始变量,并且 Select @curDate := Date_Add... blah blah 声明取@curDate 的当前值,将其添加 1 天(现在变为 11 月 22 日)并将其存储在返回的行“MyJoinDate”中。所以现在,这个内部查询会创建您的日期表,其中包含从 11 月 22 日到 18 天的数据,并具有别名“AllDaysYouWant”供查询的其余部分参考。

我已将您可能遇到的查询调整为 alias.field 一切以进行澄清...

于 2012-12-06T23:48:32.370 回答
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

查询没有错误,工作正常

于 2013-09-26T12:53:05.123 回答
1

您需要做什么
1. 生成日期范围。
2.然后选择那些不存在于您上面的查询结果中的日期
3.并与上面的查询进行联合。

于 2012-12-06T23:50:25.237 回答