如何创建一个返回类似
的SQL查询---------------------
|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时没有记录?
答案 0 :(得分:3)
您需要一个包含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
接下来,让我们用它来构建一个包含七个日期的虚拟表。对于这个例子,我们今天和前六天选择。
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)
最后,从日期列表开始,让我们将摘要加入LEFT JOIN。
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具有内置的基数序列虚拟表,如seq_0_to_6。这很方便。
答案 1 :(得分:2)
您需要构建一个虚拟日期表,并将当前表连接起来。
SELECT dummy.date, SUM(IFNULL(yourtable.record,0)) recordcount
FROM dummy
LEFT JOIN yourtable on dummy.date=yourtable.date
GROUP BT dummy.date
请注意我用零替换空值。
答案 2 :(得分:1)
一种解决方案是创建一个包含所需日期的日历表。然后,您可以将其加入您的数据,以获得您的目标
答案 3 :(得分:1)
首先,你必须使用左连接,使用IFNULL函数将NULL转换为0。尝试匹配您的表并使用左连接。