mysql - 比较年度统计数据时用缺失日期填充 MYSQL 数据?

标签 mysql date

我有一个表格来跟踪发送的电子邮件。这很简单。

编号 |日期时间 |电子邮件 |主题 |留言

多年来我一直在收集数据。有时我在表中没有任何条目。

查询1:

SELECT COUNT(ID) FROM emails
WHERE DATE(datetime) >= 'XXXX-XX-XX'
AND DATE(datetime) is <= 'ZZZZ-ZZ-ZZ'
GROUP BY DATE(datetime)

然后我使用一些 php 为 XXXX 和 YYYY 获取一年前的时间并运行与第一个相同的第二个查询...

查询2:

SELECT COUNT(ID) from emails
WHERE DATE(datetime) >= 'XXXX-XX-XX'
AND DATE(datetime) is <= 'ZZZZ-ZZ-ZZ'
GROUP BY DATE(datetime)

我正在使用图表包来比较某个日期范围内收到的电子邮件数量,然后叠加一年前相同范围内收到的电子邮件数量。现在这是两个查询,我将结果绘制成图表。

问题是 mysql 在某一天没有 2011 年的任何电子邮件,但在同一天有一些 2012 年的电子邮件。

合并结果并将它们绘制成图表会扭曲结果,因为我缺少日期和去年的 0 值,这实际上使我的所有值不再匹配。

2011-03-01 10    2012-03-01 4
2011-03-02 4     2012-03-02 2
2011-03-03 6     2012-03-04 1  <---- see where the two queries
                               end up diverging? (I had nothing
                               logged for 2012-03-03 so naturally
                               it was not in the results.

有没有办法让 mysql 输出我需要的数据,包括值出现在一年而不是另一年的日期,或者如果任何一年都没有值出现(仍然需要日期和 0),那么我的图表可以工作吗?

我似乎不知道该怎么做...

谢谢!

最佳答案

有几种不同的方法可以获取一组连续日期的结果。我最喜欢的方法是使用虚拟表或来自 AI PK 的现有连续 id 集来创建所需的完整集。像这样的 -

SELECT '2011-01-01' + INTERVAL (id -1) DAY
FROM dummy
WHERE id BETWEEN 1 AND 365

这将返回 2011 年的一整套天数,然后可以将其左联接到您的电子邮件表中以获取计数 -

SELECT `dates`.`date`, COUNT(emails.id)
FROM (
    SELECT '2011-01-01' + INTERVAL (id - 1) DAY AS `date`, '2011-01-01 23:59:59' + INTERVAL (id - 1) DAY AS `end_of_day`
    FROM dummy
    WHERE id BETWEEN 1 AND 365
) `dates`
LEFT JOIN emails
    ON `emails`.`datetime` BETWEEN `dates`.`date` AND `dates`.`end_of_day`
GROUP BY `dates`.`date`

要填充您的虚拟/序列表,您可以手动插入前十个值,然后使用 INSERT ... SELECT 添加其余值 -

CREATE TABLE dummy (id INTEGER NOT NULL PRIMARY KEY);
INSERT INTO dummy VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
SET @tmp := (SELECT MAX(id) FROM dummy) + 1;
INSERT INTO dummy
SELECT @tmp + id
FROM dummy;

您需要在每次运行 INSERT ... SELECT 查询之前执行 SET 查询。

关于mysql - 比较年度统计数据时用缺失日期填充 MYSQL 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10156613/

相关文章:

php - 在 Codeigniter 中进行查询

mySQL 索引和准备状态

php - 如何获取以下查询的结果计数?

javascript - 如何在 Moment.js 中从小时和分钟创建完整时间字符串?

MySQL - 一行中的多个值

mysql - vb.net mysql 查询在单击中运行

android - 如何从android中的指定日期获取日期

php - 如何检测当前日期是否大于日期时间?

sql - 在 T-SQL 中生成日期序列

python - 将日期转换为 %Y :%j:%H:%M:%s in python with date command