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所有内容都要澄清......