3

背景

这是支持前端 Highcharts 安装的 API。用户可以选择“天”(24 小时)、一周(7 天)或自定义间隔,没有任何限制。由于所选日期范围的性质(已完成),x 轴(日期/时间)需要完全动态。

Y轴

我们计算 X 轴(日期)的方式工作得很好,但是我们在某一天返回空值时遇到了麻烦。

我们使用这个查询来计算值:

SELECT COUNT(u.videoid)                   AS metric, 
       FROM_UNIXTIME(u.TIME, '%M %e, %Y') AS `sqltime` 
FROM   videos u 
WHERE  ( u.TIME >= 1291179600 
         AND u.TIME <= 1293858000 ) 
       AND u.channel = '48' 
GROUP  BY `sqltime` 
ORDER  BY `sqltime` ASC

这是一个示例输出:

metric  sqltime 
2   December 13, 2010
9   December 14, 2010
1   December 15, 2010
7   December 16, 2010
32  December 17, 2010
10  December 18, 2010
6   December 19, 2010
17  December 20, 2010
19  December 21, 2010
10  December 22, 2010
20  December 23, 2010
8   December 24, 2010
9   December 26, 2010
33  December 27, 2010
29  December 28, 2010
24  December 29, 2010
34  December 30, 2010
11  December 31, 2010

问题是它没有返回 12 月 25 日的值(以 0 作为度量值)。这导致 Highcharts 完全跳过该值,而不是显示 0。所以这是当前图表的样子:

样本

但它真的应该是这样的: 已更正

红线在哪里。唯一的方法是为 2010 年 12 月 25 日返回 0 值(例如)。

问题

videos所以问题又是,当表中没有该日期/时间和 WHERE 条件的行时,如何修改我的查询以返回值 0 ?

更多信息

以下是我们当前计算 x 轴的方式:

    public function getCordinateCount()
    {
        $totalTime = $this->endTime - $this->startTime;

        // 86400 seconds in a day.
        $days = ceil($totalTime / 86400);

        if($days <= 1) {
            return 'FROM_UNIXTIME( u.time, \'%M %e, %Y %H:00\') AS `sqltime`';
        } elseif ($days < 60) {
            return 'FROM_UNIXTIME( u.time, \'%M %e, %Y\') AS `sqltime`';
        } else {

            return 'DATE_FORMAT(
                        SUBDATE(
                          FROM_UNIXTIME( u.time ),
                          INTERVAL WEEKDAY( FROM_UNIXTIME( u.time ) ) DAY
                        ),
                        \'%M %e, %Y\') as `sqltime`';
        } 

    }
4

1 回答 1

0

我会尝试在所有日子(从 1 月 1 日到 12 月 31 日)都有一张 DAYS 表。

然后做一个左连接。如果指标为空,则结果为零 =>

SELECT IF(tmp.metric IS NULL,0,tmp.metric),DAYS.datestr FROM DAYS LEFT JOIN (
SELECT COUNT(u.videoid)                   AS metric, 
       FROM_UNIXTIME(u.TIME, '%M %e, %Y') AS `sqltime` 
FROM   videos u 
WHERE  ( u.TIME >= 1291179600 
         AND u.TIME <= 1293858000 ) 
       AND u.channel = '48' 
GROUP  BY `sqltime` 
) tmp ON DAYS.datestr=tmp.`sqltime`
ORDER  BY `sqltime` ASC

(我想这里 DAYS.datestr 的格式与 sqltime 相同)。

这就是我在QUERY中的做法。但我真的会在 PHP 中这样做,首先将整个数组设置为 0 值,然后将其与查询结果合并。

HIH

于 2012-04-12T19:48:52.460 回答