每当有人第一次访问该网站时,我都会在mysql表中存储一个时间戳。
我最终得到的数据如下:
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
我想要对这些数据做什么是创建每小时的访问次数。所以在上面的例子中,我将在第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;
}
这对我来说似乎合乎逻辑......但出于某种原因......它绝对不起作用。
你会怎么做?
答案 0 :(得分:6)
怎么样:
SELECT hour(added), count(*)
FROM visits
WHERE added >= CURRENT_DATE()-1
GROUP BY hour(added)
Hour(time):“返回时间的小时。对于时间值,返回值的范围是0到23”,
答案 1 :(得分: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方面,你将不得不“重建”完整的日期,因为这个查询只能为你提供时间。