即使没有记录,也获取最近 7 天的计数
Get last 7 days count even when there are no records
我如何进行 SQL 查询 returns 我像
---------------------
|DATE | Count |
---------------------
|2015/01/07 | 7 |
|2015/01/06 | 0 |
|2015/01/05 | 8 |
|2015/01/04 | 5 |
|2015/01/03 | 0 |
|2015/01/02 | 4 |
|2015/01/01 | 2 |
---------------------
什么时候第6个和第3个都没有记录?
一个解决方案是创建一个包含您需要的所有日期的日历table。然后你可以将它加入你的数据以获得你想要的
您需要构建一个虚拟日期 table 并加入您当前的 table 反对它。
SELECT dummy.date, SUM(IFNULL(yourtable.record,0)) recordcount
FROM dummy
LEFT JOIN yourtable on dummy.date=yourtable.date
GROUP BT dummy.date
请注意,我将空值替换为零。
首先你必须使用左连接,使用 IFNULL 函数将 NULL 转换为 0。尝试匹配您的 table 并使用左连接。
你需要一个table的0到6的所有序号,这个很容易通过简单的查询生成,如下
SELECT 0 AS seq
UNION ALL SELECT 1 UNION ALL SELECT 2
UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6
接下来,让我们用它来构建一个包含七个日期的虚拟 table。对于这个例子,我们选择今天和前六天。
SELECT DATE(NOW())-INTERVAL seq.seq DAY theday
FROM (
SELECT 0 AS seq
UNION ALL SELECT 1 UNION ALL SELECT 2
UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6
) seq
然后进行汇总查询。你没有说具体是怎么回事,所以我猜。这个给你六天前到今天的记录。今天还在进行中
SELECT DATE(i.item_time) theday
COUNT(*) `count`
FROM items i
WHERE i.item_time >= DATE(NOW()) - INTERVAL 6 DAYS
GROUP BY DATE(i.item_time)
最后,从天数列表开始,让我们向其中加入该摘要。
SELECT thedays.theday, IFNULL(summary.`count`,0) `count`
FROM (
SELECT DATE(NOW())-INTERVAL seq.seq DAY theday
FROM (
SELECT 0 AS seq
UNION ALL SELECT 1 UNION ALL SELECT 2
UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6
) seq
) thedays
LEFT JOIN (
SELECT DATE(i.item_time) theday
COUNT(*) `count`
FROM items i
WHERE i.item_time >= DATE(NOW()) - INTERVAL 6 DAYS
GROUP BY DATE(i.item_time)
) summary USING (theday)
ORDER BY thedays.theday
它看起来很复杂,但它只是三个基本查询的组合。把它想象成一个三明治,用 ORDER BY
牙签将面包、奶酪和西红柿粘在一起。
这是一篇更详尽的文章。 http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/
MariaDB 版本 10 具有内置的虚拟 table 基数序列,例如 seq_0_to_6。这样方便。
我如何进行 SQL 查询 returns 我像
---------------------
|DATE | Count |
---------------------
|2015/01/07 | 7 |
|2015/01/06 | 0 |
|2015/01/05 | 8 |
|2015/01/04 | 5 |
|2015/01/03 | 0 |
|2015/01/02 | 4 |
|2015/01/01 | 2 |
---------------------
什么时候第6个和第3个都没有记录?
一个解决方案是创建一个包含您需要的所有日期的日历table。然后你可以将它加入你的数据以获得你想要的
您需要构建一个虚拟日期 table 并加入您当前的 table 反对它。
SELECT dummy.date, SUM(IFNULL(yourtable.record,0)) recordcount
FROM dummy
LEFT JOIN yourtable on dummy.date=yourtable.date
GROUP BT dummy.date
请注意,我将空值替换为零。
首先你必须使用左连接,使用 IFNULL 函数将 NULL 转换为 0。尝试匹配您的 table 并使用左连接。
你需要一个table的0到6的所有序号,这个很容易通过简单的查询生成,如下
SELECT 0 AS seq
UNION ALL SELECT 1 UNION ALL SELECT 2
UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6
接下来,让我们用它来构建一个包含七个日期的虚拟 table。对于这个例子,我们选择今天和前六天。
SELECT DATE(NOW())-INTERVAL seq.seq DAY theday
FROM (
SELECT 0 AS seq
UNION ALL SELECT 1 UNION ALL SELECT 2
UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6
) seq
然后进行汇总查询。你没有说具体是怎么回事,所以我猜。这个给你六天前到今天的记录。今天还在进行中
SELECT DATE(i.item_time) theday
COUNT(*) `count`
FROM items i
WHERE i.item_time >= DATE(NOW()) - INTERVAL 6 DAYS
GROUP BY DATE(i.item_time)
最后,从天数列表开始,让我们向其中加入该摘要。
SELECT thedays.theday, IFNULL(summary.`count`,0) `count`
FROM (
SELECT DATE(NOW())-INTERVAL seq.seq DAY theday
FROM (
SELECT 0 AS seq
UNION ALL SELECT 1 UNION ALL SELECT 2
UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6
) seq
) thedays
LEFT JOIN (
SELECT DATE(i.item_time) theday
COUNT(*) `count`
FROM items i
WHERE i.item_time >= DATE(NOW()) - INTERVAL 6 DAYS
GROUP BY DATE(i.item_time)
) summary USING (theday)
ORDER BY thedays.theday
它看起来很复杂,但它只是三个基本查询的组合。把它想象成一个三明治,用 ORDER BY
牙签将面包、奶酪和西红柿粘在一起。
这是一篇更详尽的文章。 http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/
MariaDB 版本 10 具有内置的虚拟 table 基数序列,例如 seq_0_to_6。这样方便。