创建日期列表有许多技巧(或类似的数字序列)。我喜欢与MySQL一起使用的是使用@sqlvariables。我通常会从基线值开始,例如您的日期为-2天。我将对数据库中的任何其他表进行交叉连接,这些表至少具有与您的输出一样多的记录数......说30天或全年366天或更长时间。内部的SQL变量准备将不断增加自己的增量(你甚至可以做日期范围,如开始/结束一周,月等)。现在你有你想要填写的所有可能日期的表格。
现在,我通过值进行辅助查询 - 在这种情况下,您的电子邮件日期和应用组。在此查询中使用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
现在,通过查询来判断,但是未澄清的请求......你的邮件表可以有将来的日期?那是对的吗?如博士办公室和约会是为未来,你想收到一个给定的范围内的电子邮件。这就是我所推断的,因此我的限制只能在30天内出去......如果您需要更长的时间,只需扩展LIMIT子句即可。
考虑在应用程序代码 – Strawberry
处理数据显示的问题(如丢失的日期问题)只有你想要今天和昨天的电子邮件计数? –
@PaulSpiegel是的。但即使电子邮件表中没有行,或没有满足查询的行,输出必须有今天和昨天为0 – EnexoOnoma