3

バックグラウンド

これは、フロントエンドのHighchartsインストールを強化するAPIです。ユーザーは、「日」(24時間)、1週間(7日)、またはカスタム間隔を制限なしで選択できます。選択した日付範囲の性質により、x軸(日付/時刻)は完全に動的である必要があります(これは完了しています)。

Y軸

X軸(日付)の計算方法はかなりうまく機能していますが、特定の日にnull値を返すのに問題があります。

このクエリを使用して値を計算しています。

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 を作成してみます。

次に、LEFT JOIN を実行します。メトリックが null の場合、結果は ZERO =>

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 の値に設定してから、それをクエリの結果とマージします。

ハイ

于 2012-04-12T19:48:52.460 に答える