2009-08-02 74 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 

什麼IM想這個數據做的是創造落入每小時的訪問次數。所以在上面的例子中,我會到達第4小時有2次訪問,第5小時= 1,6第2小時,第8小時1等。

我認爲最好的辦法是做一個for這樣的陳述:

// 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子句?

像這樣的事情可能會做:

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) 

(當然,你可能需要調整一些東西,比如日期)

它將使您的數據庫服務器的工作更多的是查詢比對你提出的其他人......但只有一個查詢,而不是24 - 這是一件好事。
在另一邊,你不得不更少的數據從數據庫服務器到PHP服務器去;這很棒,特別是如果桌子很大!

然後,在PHP端,你必須「重建」完整的日期,因爲這個查詢只能得到你的時間。

+0

我只是想用上面的方法添加,一個小問題相比,我在做什麼是我要創建2個陣列。 1,在它的名字小時,1例在小時訪問的次數。 使用這裏帕斯卡爾的方法,我得到缺少時間,如果有沒有像這樣的時刻訪問: 「12AM」,「上午01點」,「上午04點」,「上午05點」,「上午07點」,「上午08點」,」上午09點」, 「11AM」, 「12PM」, 「下午2點」, 「下午3點」, 「下午4點」, 「下午5點」, 「下午7點」, 「下午8點」, 「下午9點」, 「晚上10點」, 「11PM」 和參觀: 10,1,19,3,1,3,1,3,10,1,1,3,1,6,1,2,2,4 因此,有18我想出來的,這意味着24小時中有4小時沒有訪問。理想情況下,我想取回數0空小時 – willdanceforfun 2009-08-03 01:02:28

6

如何:

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

Hour(time):「返回小時的時間返回值的範圍是0到23的時間 - 日期值」,