2017-02-08 9 views
0

私はクライアントの詳細を持つmysqlデータベースを持っています。毎時の訪問、ページビューを配列に表示したいのです。私は以下のmysqlクエリを与えた。mysqlから時間データを取得するには?

   <?php 
$siteid=$_GET["site"]; 

      $DB = mysqli_connect('localhost','username','password','databasename'); 
      $Q = "SELECT time, COUNT(*), pw FROM clientstats WHERE siteid='$siteid' AND time > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 26970 SECOND)) GROUP BY HOUR(FROM_UNIXTIME(`time`)) ORDER BY time ASC"; 
      $R = mysqli_query($DB,$Q); 
      //start loop 
      //while or foreach 
      while($row = mysqli_fetch_assoc($R)){ 

date_default_timezone_set('Asia/Kolkata'); 
$timestamp = $row['time']; 
$timee = date('H', $timestamp); 
$times = $row['COUNT(*)']+$row['wh']; 


      echo ",['$timee', {$row['COUNT(*)']}, $times]\r\n"; 

      } 
      ?> 

ここで、26970は真夜中から今までの秒数です。このコードは正常に動作し、この

,['02', 2, 3] ,['02', 1, 2] ,['04', 1, 2] ,['05', 1, 2] ,['06', 2, 3] 

この配列構造のような配列である出力[「HOUR」、訪問、PW]が、問題は、これが1,2,3のように連続して各時間の値を示していないということです、4,5,6 ....私は毎時間の値を表示したい。その時間の値がnilの場合、その時間値を['時間'、0、0]として出力したいのですが、上記の出力に2時間目が倍増しています。それを修正する方法。

ご協力ありがとうございます。

答えて

0

SELECTステートメントを使用してMySQLから返された結果を取得するには、カウントを取得しているテーブルから「不足している」時間値を返すローソースが必要です。

(この結果をクエリから取得することは、1つのオプションに過ぎず、クライアント側で別の方法でアプローチすることもできます。たとえば、配列に時間を入力して元のクエリを実行し、この答えは、MySQLに指定された結果を返す方法を示しています)。

私たちがこれを行う方法の一例として、ここでは24行の整数値を返すクエリがあります23.

  SELECT 00 AS hr  UNION ALL SELECT 01 UNION ALL SELECT 02 UNION ALL SELECT 03 
     UNION ALL SELECT 04 UNION ALL SELECT 05 UNION ALL SELECT 06 UNION ALL SELECT 07 
     UNION ALL SELECT 08 UNION ALL SELECT 09 UNION ALL SELECT 10 UNION ALL SELECT 11 
     UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 
     UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 
     UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 

から0我々は括弧でそのクエリをラップし、別のク内のテーブルの代わりに、その参照することができますエリー。

SELECT i.hr 
    FROM (-- 0 thru 23 
     SELECT 00 AS hr  UNION ALL SELECT 01 UNION ALL SELECT 02 UNION ALL SELECT 03 
     UNION ALL SELECT 04 UNION ALL SELECT 05 UNION ALL SELECT 06 UNION ALL SELECT 07 
     UNION ALL SELECT 08 UNION ALL SELECT 09 UNION ALL SELECT 10 UNION ALL SELECT 11 
     UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 
     UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 
     UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 
     ) i 
    ORDER BY i.hr 

整数のセットを返す他の方法があります。この例は、クエリ内に含まれるインラインビュー(派生テーブル)の単なる例です。これは、データベース内の追加のテーブルに依存しません。

データベースに、0から23までの整数値を持つ24個の行を含むテーブルがある場合、インラインビューの代わりにそれを参照できます。

外部クエリにWHERE句を追加して、hrの値が現在の時間より後の行を除外することもできます。

そして、2桁の時間(先頭にゼロがある)を返す場合は、SELECTリストで式を使用できます。そのトリックを行ういくつかの表現があります。

SELECT RIGHT(CONCAT('0',i.hr),2) AS hh 
    FROM (-- 0 thru 23 
     SELECT 00 AS hr  UNION ALL SELECT 01 UNION ALL SELECT 02 UNION ALL SELECT 03 
     UNION ALL SELECT 04 UNION ALL SELECT 05 UNION ALL SELECT 06 UNION ALL SELECT 07 
     UNION ALL SELECT 08 UNION ALL SELECT 09 UNION ALL SELECT 10 UNION ALL SELECT 11 
     UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 
     UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 
     UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 
     ) i 
    WHERE i.hr <= HOUR(NOW()) 
    ORDER BY i.hr 

元のクエリから返された行と、それから返された行が一致します。外部結合操作を使用することができますので、カウントクエリと一致する行がない場合は1時間に1行を返します。

はゼロとして返されるカウント「欠落」を取得するために、我々は条件付きのテストを実行し、0

SELECT RIGHT(CONCAT('0',i.hr,2)) AS hh 
    , IFNULL(t.cnt,0) AS visits 
    , IFNULL(t.pw,0) AS pw 
    FROM (-- 0 thru 23 
     SELECT 00 AS hr UNION ALL SELECT 01 UNION ALL SELECT 02 UNION ALL SELECT 03 
     UNION ALL SELECT 04 UNION ALL SELECT 05 UNION ALL SELECT 06 UNION ALL SELECT 07 
     UNION ALL SELECT 08 UNION ALL SELECT 09 UNION ALL SELECT 10 UNION ALL SELECT 11 
     UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 
     UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 
     UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 
     ) i 
    LEFT 
    JOIN (-- counts by hour 
     SELECT HOUR(FROM_UNIXTIME(s.time)) AS hr 
       , COUNT(*) AS cnt 
       , MAX(s.pw) AS pw 
      FROM clientstats s 
      WHERE s.siteid = '$siteid' 
      AND s.time >= UNIX_TIMESTAMP(DATE(NOW())) 
      AND s.time < UNIX_TIMESTAMP(NOW()) 
      GROUP BY HOUR(FROM_UNIXTIME(s.time)) 
     ) t 
    ON t.hr = i.hr 
WHERE i.hr <= HOUR(NOW()) 
ORDER BY i.hr ASC 

でNULL値を置き換える指定が返されますいくつかの異なるクエリがあります。結果。しかし、トリック...返される0のカウントを取得するには、カウントされているテーブルにその時間の値が存在しない場合でも、返される時間の値を返すローソースが必要です。

+0

このクエリを試しましたが、何も表示されませんでしたか?もっと説明できますか?私の現在の正確なクエリはSELECT時間、COUNT(*)、WHERE siteid = '$ siteid'と時間> UNIX_TIMESTAMP(DATE_SUB(NOW)、INTERVAL 26970 SECOND))GROUP BY HOUR(FROM_UNIXTIME( 'time')) ORDER BY時間ASC – PARVINDER

関連する問題