在 MySQL 中,您可以使用 MySQL 变量(类似于内联编程值)。您可以根据需要设置并进行操作。
select
dayofmonth( DynamicCalendar.CalendarDay ) as `Day`,
count(*) as Entries
from
( select
@startDate := date_add( @startDate, interval 1 day ) CalendarDay
from
( select @startDate := '2013-05-31' ) sqlvars,
AnyTableThatHasAsManyDaysYouExpectToReport
limit
6 ) DynamicCalendar
LEFT JOIN Input_Calendar c
on DynamicCalendar.CalendarDay = date( from_unixtime( c.date ))
group by
DynamicCalendar.CalendarDay
在上面的示例中,内部查询可以加入,正如名称所暗示的那样,您的数据库中的“任何表”至少有 X 条您试图为其生成的记录......在这种情况下,您只处理当前6 月份,只需要 6 条记录,但如果你想做一整年,只需确保“任何表”有 365 条记录(或更多)。
内部查询将通过将“@startDate”设置为 6 月 1 日(5 月 31 日)之前的一天开始。然后,通过仅拥有另一个表,将导致通过 6 条记录(生成报告的天数)的限制将每条记录加入到该变量(创建模拟的 for/next 循环)。所以现在,在查询记录时,开始日期不断增加 1 天......第一个记录结果在 6 月 1 日,下一个记录在 6 月 2 日,等等。
所以现在,您有一个模拟日历,其中有 6 条记录,日期从 6 月 1 日到 6 月 6 日。把它加入到您的“数据”表中,您已经通过加入来限定您的日期,并且只获得这些活动日期。我加入了来自 unix 时间的 DATE(),因为您关心 6 月 1 日发生的任何事情,并且 6 月 1 日 @ 12:00:00AM 与 6 月 1 日 @ 8:45am 不同,因此仅匹配日期部分,它们应该保持在适当的分组中。
您可以通过将内部 '2013-05-31' 更改为某些 MySQL Date 函数来扩展此答案,以获取上个月的最后一天,并根据您当前月份的任何一天进行限制,因此这些并不难-编码。