点击的话,一般都是用web server日志来记录的。之后再进行统计。
周,月,季度 应该是在日的基础上累加。当然要是弄独立ip点击的话,按月,季度统计的话就计算量太大了。

解决方案 »

  1.   

    存的时候有一个时间字段,存里面个时间截,然后按什么查,就看你怎么写SQL语句了。
      

  2.   

    很久以前写的一个统计的函数,希望你用的上
    其中$db为mysql的操作类。
    ------------------------------------------------ /**
         * 访问量统计
     * 每个ELSE后面$db->Execute("UPDATE `statistics_num` set `*Hits` = '0'");表示清零
         * @param string $type 类型
         */
        function getStatisticsNum($field='*', $type=Null)
        {
            GLOBAL $db;        $where  = $type ? "`Type` = '{$type}'" : '1';
            $result = $db->getRow("Select SUM(Hits) as Hits, SUM(DayHits) as DayHits From `statistics_num` ");
            Return $result;
        }
        function statisticsNum($type=Null)
        {
            GLOBAL $db;        if(!$type)Return False; $result = $db->getRow("select * from `statistics_num` where `Type` = '{$type}';");
    //print_r($result);        if($result){
                //从数据库里初始化
                $id          = $result['ID'];         //该纪录ID
                $oldTimeStamp = $result['LastHits'];   //最后点击时间
                $hits = $result['Hits'];   //总点击
                $yhits = $result['YearHits'];   //年点击
                $mhits = $result['MonthHits'];  //月点击
                $whits = $result['WeekHits'];   //周点击
                $dhits = $result['DoubleDayHits']; //天点击
                $ddhits = $result['DayHits'];    //48小时点击
            }
            else{
                $oldTimeStamp = strtotime(date('Y-m-d 00:00:00', time()));
                $hits = $yhits = $mhits = $whits = $dhits = $ddhits = 0;
            } $nowDateArray = getdate();
    $oldDateArray = getdate($oldTimeStamp); //year process
    if($nowDateArray["year"] == $oldDateArray["year"]):
    $yhits ++;
    else:
    @$db->Execute("UPDATE `statistics_num` set `YearHits` = '0' /*where `ID` = '{$id}'*/");
    $yhits = 1;
    endif; //month process
    if($nowDateArray["year"] == $oldDateArray["year"] && $nowDateArray["mon"] == $oldDateArray["mon"]):
    $mhits ++;
    else:
    @$db->Execute("UPDATE `statistics_num` set `MonthHits` = '0'");
    $mhits = 1;
    endif; //week process
    //取得本周的开始结束时间段-[13985019168] //本周开始时间,从今天开始后退n天到星期天的0点,一个周从星期天开始.如果从星期一开始把0,0,0改为23,59,59
    $tmpStartDate = mktime(0,0,0,$nowDateArray["mon"],$nowDateArray["mday"],$nowDateArray["year"]) - ($nowDateArray["wday"] * 86400);
    //本周结束时间,本周六12点59
    $tmpEndDate = mktime(23,59,59,$nowDateArray["mon"],$nowDateArray["mday"],$nowDateArray["year"]) + ((6 - $nowDateArray["wday"]) * 86400);
    //如果上次更新在这个时间段内,为同一周
    if($oldTimeStamp >= $tmpStartDate && $oldTimeStamp <= $tmpEndDate):
    $whits ++;
    else:
    @$db->Execute("UPDATE `statistics_num` set `WeekHits` = '0'");
    $whits = 1;
    endif;
    //double day process==>48hours
    //如果相差时间在48小时内,为同一个48小时 && 
    //时间差大于48小时,清零
    if( 60*60*24*2 < ($nowDateArray[0] - $oldDateArray[0]) ):
    @$db->Execute("UPDATE `statistics_num` set `DoubleDayHits` = '0'");
    $ddhits = 1;
    //如果时间相差在24~48小时内,前一天+1
    elseif( 60*60*24*2 > ($nowDateArray[0] - $oldDateArray[0]) && ($nowDateArray[0] - $oldDateArray[0]) > 60*60*24 ):
    $ddhits = $dhits+1;
    //如果相差在24小时内,直接+1
    else:
    $ddhits = $ddhits+1;
    endif;
    //day process
    if( $nowDateArray["year"] == $oldDateArray["year"] && 
                $nowDateArray["mon"] == $oldDateArray["mon"] && 
                $nowDateArray["mday"] == $oldDateArray["mday"]):
    $dhits ++;
    else:
    @$db->Execute("UPDATE `statistics_num` set `DayHits` = '0', `LastHits` = '{$nowDateArray[0]}'");
    $dhits = 1;
    endif;
            //接下来更新数据库
            if($result){
                $hits ++;//总点击数加1            $sql = "UPDATE `statistics_num` set `Hits` = '{$hits}', `LastHits` = '{$nowDateArray[0]}', `YearHits` = '{$yhits}', `MonthHits` = '{$mhits}', `WeekHits` = '{$whits}', `DayHits` = '{$dhits}', `DoubleDayHits` = '{$ddhits}' where `ID` = '{$id}'";
            }
            else{
                $sql = "INSERT INTO `statistics_num` (`Hits`, `YearHits`, `MonthHits`, `WeekHits`, `DoubleDayHits`, `DayHits`, `LastHits`, `Type`) VALUES ('1', '1', '1', '1', '1', '1', '" . time() . "', '{$type}');";
            } $db->Execute($sql);
        }//End function
      

  3.   

    时间字段最好用time()函数获得的时间戳,不要搞个什么年月日时分秒的,效率低下。就存一个bigint类型的秒数最好。
      

  4.   

    其实建议你还是用第三方软件来做这个统计,或者直接LOADFILE apache的日志来分析比较好,随着数据量的增大,统计的效率也会是越来越慢。我有过这种经历,效率低的实在无法接受,后来把apache日志按天分页,这样apache每天的记录存为一个文件,然后用shell脚本定时的执行一个sql,sql来LOADFILE apache日志。之后执行复杂的统计计算,写入一张结果表里面,我的前台只需要读取那张表就可以了。所有的点击,排行有一天的时间缓存。这样既简单,效率又很高。
      

  5.   

    统计时以时间戳的形式INSERT到一个表,然后定时按时,日,月季,导到另一个表