我有这样的查询:
SELECT COUNT(id), MONTH(date), YEAR(date)
FROM activity
GROUP BY YEAR(date) DESC, MONTH(date) DESC
ORDER BY YEAR(date) DESC, MONTH(date) DESC
按月份/日期记录哪些订单和组。如果某个月没有记录,我有什么办法可以插入一个空白行吗?
所以,而不是这个回报:
c | M% | Y%
4 | 01 | 2014 # 4 records for Jan 2014
3 | 11 | 2013 # 3 records for Nov 2013
7 | 10 | 2013 # 7 records for Oct 2013
我想插入没有找到记录的月份(2013年1月,计数= 0),所以我可以对月度活动进行整洁的可视化。
c | M% | Y%
4 | 01 | 2014
0 | 12 | 2013 # <<<< no records for Dec 2013, but I still want it in array
3 | 11 | 2013
7 | 10 | 2013
答案 0 :(得分:0)
与其他人相反,您可以使用SQL变量在MySQL查询中进行组合。我的内部查询创建的基准日期比Now()更早一个月。这与活动表连接只是为了让行可以使用。只需将SQL变量设置为小于前一个月结果的一个月即可创建该列。在这个例子中,我的限制为6,所以它只能追溯6个月的数据,但你可以将它改为你关心的多少...只要“Activity”表中有那么多记录(可以是任何表,只要它具有您想要创建这些占位符记录的记录数)。这会创建一个结果集 我所拥有的“DynamicCalendar”。然后我使用它作为左/月连接到月/年加入的活动的基础
SELECT
MONTH( DynamicCalendar.GrpDate ) as Mth,
YEAR( DynamicCalendar.GrpDate ) as Yr,
COUNT(activity.id) as Entries
from
( select
@BaseDate := date(date_sub(@BaseDate, interval 1 month)) as GrpDate
from
( select @BaseDate := date_add(Now(), interval 1 month)) sqlvars,
Activity,
limit
6 ) DynamicCalendar
LEFT JOIN Activity
ON MONTH( DynamicCalendar.GrpDate ) = MONTH( Activity.Date )
AND YEAR( DynamicCalendar.GrpDate ) = YEAR( Activity.Date )
group by
MONTH( DynamicCalendar.GrpDate ) as Mth,
YEAR( DynamicCalendar.GrpDate ) as Yr
order by
YEAR( DynamicCalendar.GrpDate ) DESC,
MONTH( DynamicCalendar.GrpDate )