Php MySQL中的时间范围分组
基本知识: 我有一个计算访客数量的脚本。一些有用的信息存储在MySQL数据库中。现在一年多过去了,我有超过18万条数据记录,读取实际访客的脚本非常慢 我有一个脚本,它统计访问者并检查是同一个访问者还是新访问者。因此,我有一个3小时的时间范围,只有在这个范围之后,访问才会计算其他时间 脚本:Php MySQL中的时间范围分组,php,mysql,group-by,Php,Mysql,Group By,基本知识: 我有一个计算访客数量的脚本。一些有用的信息存储在MySQL数据库中。现在一年多过去了,我有超过18万条数据记录,读取实际访客的脚本非常慢 我有一个脚本,它统计访问者并检查是同一个访问者还是新访问者。因此,我有一个3小时的时间范围,只有在这个范围之后,访问才会计算其他时间 脚本: $besucher_query = mysql_query('SELECT `time`, `agent` FROM `besucher` ORDER BY `ip` ASC'); while($besuch
$besucher_query = mysql_query('SELECT `time`, `agent` FROM `besucher` ORDER BY `ip` ASC');
while($besucher = mysql_fetch_array($besucher_query)) {
$newtime = $besucher['time'];
$newagent = $besucher['agent'];
$limit = 3 /*std*/ * 60 /*min*/ * 60 /*sek*/; // three hours before same visitor counts again
$diff = $newtime - $limit;
if($oldtime <= $diff or ($oldtime > $diff and $newagent != $oldagent))
$besucherzahl++;
$oldtime = $besucher['time'];
$oldagent = $besucher['agent'];
}
$anzahl_besucher = $besucherzahl;
echo $anzahl_besucher;
我在几年前创建了这个脚本,我知道这是最难看的方式。时间以UNIX时间戳格式存储
现在我的问题是:
如何在MySQL中直接将其与3小时以上的条件规则进行分组?您可以直接从PHP脚本执行以下查询,以获取过去3小时的唯一访客总数:
SELECT COUNT(DISTINCT `agent`) AS visitor_count
FROM `besucher`
WHERE `time` >= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 HOUR);
但是,如果您有记录,比如2:59和3:01,这些记录将在输出中报告为两个单独的记录。如果要测量连续运行,则需要执行与当前代码类似的操作-但是可以将结果存储在DB中,以免再次计算-只需添加一个引用指定为会话开始的行的新列:
ALTER TABLE besucher ADD COLUMN session_start INTEGER;
然后
$limit = 3 /*std*/ * 60 /*min*/ * 60 /*sek*/;
$since=(integer)(file_get_contents('lastrun'))-$limit;
$besucher_query = mysql_query('SELECT
ip, `time`, `agent` FROM `besucher`
WHERE `time`>$since
ORDER BY agent, ip, `time` ASC');
while($besucher = mysql_fetch_array($besucher_query)) {
$newtime = $besucher['time'];
$newagent = $besucher['agent'];
$newip = $besucher['ip'];
if ($newagent!=$oldagent
|| $newip <> $oldip
|| $newtime>$oldtime+$limit
|| $newtime<$oldtime) {
$sessionstart=$newtime;
}
$newagent=mysql_real_escape_string($newagent);
mysql_query(
"UPDATE besucher SET session_start=$sessionstart
WHERE time=$newtime AND ip=$newip AND agent='$newagent'"
);
$oldtime = $besucher['time'];
$oldagent = $besucher['agent'];
}
file_put_contents('lastrun', $oldtime);
Bu一个更简单的解决方案是在代码中使用会话管理,并立即填充它
$limit = 3 /*std*/ * 60 /*min*/ * 60 /*sek*/;
$since=(integer)(file_get_contents('lastrun'))-$limit;
$besucher_query = mysql_query('SELECT
ip, `time`, `agent` FROM `besucher`
WHERE `time`>$since
ORDER BY agent, ip, `time` ASC');
while($besucher = mysql_fetch_array($besucher_query)) {
$newtime = $besucher['time'];
$newagent = $besucher['agent'];
$newip = $besucher['ip'];
if ($newagent!=$oldagent
|| $newip <> $oldip
|| $newtime>$oldtime+$limit
|| $newtime<$oldtime) {
$sessionstart=$newtime;
}
$newagent=mysql_real_escape_string($newagent);
mysql_query(
"UPDATE besucher SET session_start=$sessionstart
WHERE time=$newtime AND ip=$newip AND agent='$newagent'"
);
$oldtime = $besucher['time'];
$oldagent = $besucher['agent'];
}
file_put_contents('lastrun', $oldtime);
SELECT COUNT(*)
FROM
(SELECT DISTINCT ip, agent, session_start
FROM bessucher
WHERE time BETWEEN $a AND $b) ilv