2009-08-02 11 views
3

誰かがサイトに初めてアクセスするたびに、タイムテーブルをmysqlテーブルに保存しています。過去24時間の訪問数を時間で表示する

私はこのようになりますデータを巻き上げる:イムは、このデータをどうしたい何

2009-08-02 04:08:27 
2009-08-02 04:07:47 
2009-08-02 05:58:13 
2009-08-02 06:28:23 
2009-08-02 06:34:22 
2009-08-02 08:23:21 
2009-08-02 09:38:56 

は、各時間に陥るの訪問の数を作成することです。上記の例では、2回目の訪問で5時間目= 1、6時間目2、8時間目1などの4時間目に到着します。

これを行う最善の方法は、次のようなステートメント:

// a 24 hour loop 
for($i = 24; $i > -1; $i--) { 

    // the query for each hour 
    $sql = 'SELECT * FROM visits WHERE (DATE(added) = DATE_SUB(CURRENT_DATE(), INTERVAL ' . $i . ' HOUR))' 

$res = mysql_query($sql); 
$count = mysql_num_rows($res); 


    // store the number of rows for this loop in the array 
    $visits[] = $count; 
} 

私には論理的ですが...何らかの理由で...間違いなく動作しています。

どうすればよいですか?

答えて

2

group by節を使用して1つのクエリでのみ使用できますか?このような

何かがおそらくだろう:

select HOUR(added), count(*) as nbr 
from visits 
where added between '2009-07-14' and '2009-07-15' 
group by HOUR(added) 
order by HOUR(added) 

それはそのためのより多くのあなたのDBサーバーの作業になるだろう(もちろん、あなたが日付のような、いくつかのことを適応する必要がある場合があります)あなたの提案した他のものよりもクエリ...しかし、1つだけのクエリではなく、24 - これは良いことです。
もう一方では、DBサーバーからPHPサーバーへのデータ転送量が少なくて済みます。それは素晴らしいです、特にテーブルが大きければ!

PHP側では、完全な日付を「再構成」する必要があります。このクエリでは時間が得られます。

+0

私はちょうど私がやっていたものに比べて上記の方法に少し問題を追加したいと思っています。私は2つの配列を作成しています。 1にその時間の名前が表示され、1にはその時間の訪問数が表示されます。 ここでの方法を使用すると、時間通りの訪問がなかった場合、私は時間がありません: "12AM"、 "01AM"、 "04AM"、 "05AM"、 "07AM"、 "08AM" 「01PM」「05PM」「05PM」「01PM」「08PM」「09PM」「10PM」「11PM」 の順に表示され、 : 10,1,19,3,1,3,1,3,10,1,1,3,1,6,1,2,2,4 だから私は出てくると思います24時間のうち4時間は訪問がなかった。理想的には、私は空の時間のためのカウント0を取得したいと思います – willdanceforfun

+0

私はこの特定の問題のためにやったトリックは0から23までの値を含む時間テーブルを作成し、空白。それは汚い小さなトリックですが、それはかなりうまく動作します。 – OmerGertel

+0

@OmerGertel:それは解決策です。 PHPで結果を繰り返し処理するだけでなく、 "欠けている時間"を追加することでパフォーマンスが向上するかもしれません(これは、使用前にresulsetを "パッチ"するためのPHPコードを意味します) –

6

方法について:

SELECT hour(added), count(*) 
FROM visits 
WHERE added >= CURRENT_DATE()-1 
GROUP BY hour(added) 

Hour(time):についてはそれをやって何を、「戻り値の範囲は、時間帯の値について0〜23である時間のために時間を返します。」

関連する問題