Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL中的时间范围分组_Php_Mysql_Group By - Fatal编程技术网

Php MySQL中的时间范围分组

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

基本知识: 我有一个计算访客数量的脚本。一些有用的信息存储在MySQL数据库中。现在一年多过去了,我有超过18万条数据记录,读取实际访客的脚本非常慢

我有一个脚本,它统计访问者并检查是同一个访问者还是新访问者。因此,我有一个3小时的时间范围,只有在这个范围之后,访问才会计算其他时间

脚本:

$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