在MySQL SELECT语句中插入空行

时间:2014-01-23 16:16:16

标签: mysql datetime

我有这样的查询:

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

1 个答案:

答案 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 )