从FROM_UNIXTIME返回0计数

时间:2012-04-12 19:17:09

标签: php mysql

背景

这是为前端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.所以这是图表当前的样子:

Sample

但它应该看起来像这样: Corrected

红线所在的位置。唯一的方法是在2010年12月25日返回值0(作为示例)。

问题

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

更多信息

以下是我们目前计算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`';
        } 

    }

1 个答案:

答案 0 :(得分:0)

我会尝试在所有日子(从1月1日到12月31日)享受餐桌DAYS。

然后进行LEFT JOIN。如果度量标准为null,则结果为ZERO =&gt;

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