2

我正在创建一个图表,我可以在其中获得某个范围内每天的总视图,或者只要它可以返回。

我遇到的问题是填写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不包括在内。

因此,例如:

+------------+-------------+
| 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 |
+------------+-------------+

将被退回。

这将如何处理?

4

2 回答 2

3

几年前我这样做时,我创建了一个空数组,其中日期为键,默认值为 0。然后我简单地遍历结果 att 更改了我拥有的那些日期的值。

for each($result as $row){
   $date_stats_array[$row['date']] = $row['value'];
}
于 2012-10-17T14:10:36.193 回答
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');

https://stackoverflow.com/a/10132142/375087提供

于 2012-10-17T14:05:47.387 回答