创建日期列表(或类似的数字序列)有很多技巧。我喜欢与 MySQL 一起使用的一个是使用 @sqlvariables。我通常会从基线值开始,例如您的日期 -2 天。我将对数据库中的任何其他表进行交叉连接,该表的记录至少与您在输出中所期望的一样多......比如说 30 天,或者一整年 366 天,或者更长。内部 sql 变量 prep 将通过任何增量不断增加自身(您甚至可以执行日期范围,例如一周的开始/结束、月份等)。现在你已经有了你想要填写的所有可能日期的表格。
现在,我按值进行二次查询——在本例中是您的电子邮件日期并应用分组依据。在此查询中使用 where 子句将使 IT 更快,因为它可以在将 LEFT-JOIN 返回到日期范围结果集之前利用其查询结果集上的日期。
现在,您的简单左连接将包含所有日期的两个部分以及那些确实存在的相应计数。
请注意,“JustDates”查询中的表别名“AnyTableWithAtLeast3RecordInIt”实际上可能是您的“电子邮件”表。由于我们不关心除了记录之外的任何标准,并且在我的示例中我们应用了 30 天的限制,这将是即时的。
select
JustDates.DateToInclude,
coalesce( SumCnts.TotalEmails, 0 ) TotalEmails
from
( select
@myDate := DATE_ADD( @myDate, INTERVAL 1 DAY ) as DateToInclude
from
( select @myDate := Date_add(Curdate(), interval - 2 DAY) ) as SQLVars,
AnyTableWithAtLeast3RecordInIt
limit 30 ) JustDates
left join
( select
maildate,
COUNT(*) AS totalEmails
FROM
emails
WHERE
maildate >= Date_add(Curdate(), interval - 2 DAY)
AND company_id = 1
GROUP BY
DATE(maildate) ) SumCnts
ON JustDates.DateToInclude = SumCnts.MailDate
现在,从您的查询来看,但未澄清的请求...您的电子邮件表可以有未来的日期吗?那是对的吗?例如 Dr. Office 和约会是为未来而设的,您希望在给定范围内发送电子邮件。这就是我所推断的,因此我的限制只能使用 30 天……如果您需要更长的时间,只需延长 LIMIT 子句。