我正在创建一个图表,我可以每天获取一定范围的总观看次数,或者只要它返回。
我遇到的问题是在某一天没有查看时填写默认数量0
,有些日子一天可能绝对没有查看,所以我需要MySQL返回默认值0
当没有找到时 - 我不知道该怎么做。
这是我用来获取一天总观看次数的查询:
SELECT DATE(FROM_UNIXTIME(v.date)) AS date_views,
COUNT(v.view_id) AS total_views
FROM
(
views v
)
GROUP BY date_views
ORDER BY v.date DESC
我的结果会返回:
+------------+-------------+
| date_views | total_views |
+------------+-------------+
| 2012-10-17 | 2 |
| 2012-10-15 | 5 |
| 2012-10-14 | 1 |
| 2012-10-10 | 7 |
+------------+-------------+
但是,由于0
,2012-10-16
,2012-10-11
,2012-10-12
未包含在内,因此我希望返回2012-10-13
的日期。{ / p>
所以,例如:
+------------+-------------+
| date_views | total_views |
+------------+-------------+
| 2012-10-17 | 2 |
| 2012-10-16 | 0 |
| 2012-10-15 | 5 |
| 2012-10-14 | 1 |
| 2012-10-13 | 0 |
| 2012-10-12 | 0 |
| 2012-10-11 | 0 |
| 2012-10-10 | 7 |
+------------+-------------+
将被退回。
如何处理?
答案 0 :(得分:3)
几年前,当我这样做时,我创建了一个空数组,其中日期为关键字,默认值为0.然后我简单地循环显示结果,更改了我所拥有的那些日期的值。
for each($result as $row){
$date_stats_array[$row['date']] = $row['value'];
}
答案 1 :(得分:1)
在这种情况下,我创建了一个临时表,我填写了你想要的所有日期。之后,您可以使用该表将原始查询加入。
要填写表格,您可以使用以下程序:
DROP PROCEDURE IF EXISTS filldates;
DELIMITER |
CREATE PROCEDURE filldates(dateStart DATE, dateEnd DATE)
BEGIN
WHILE dateStart <= dateEnd DO
INSERT INTO tablename (_date) VALUES (dateStart);
SET dateStart = date_add(dateStart, INTERVAL 1 DAY);
END WHILE;
END;
|
DELIMITER ;
CALL filldates('2011-01-01','2011-12-31');