2009-08-02 138 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的时间 - 日期值”,