记录日志表
有字段登录时间,退出时间,帐号
要实现查询某段时间内的登录人数,并且按每5分钟分组查询,就是显示在该时间段内每五分钟有多少人登录select count(*),TIMESTAMPDIFF(MINUTE,l.login,l.logout)  from t_user_log l 
where l.login>=date_format('2011-01-22','%Y-%c-%d') and l.logout<=SYSDATE()
GROUP BY TIMESTAMPDIFF(MINUTE,l.login,l.logout)/5 这是我自己写的sql查询语句,但是查询出来的结果不正确,关键不知道每5分钟分组查询条件该怎么写
会的请指教下,折腾了半天了,是函数用2错了还是思路错了?谢谢

解决方案 »

  1.   

       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
      

  2.   

    刚学习MySQL,语法不太熟悉。我琢磨楼主的需求,编码如下:SHOW CREATE TABLE tb_user_login;
    CREATE TABLE `tb_user_login` (
      `user_id` varchar(20),
      `login_time` timestamp,  
      `logout_time` timestamp
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8DELIMITER $$USE `testdb`$$DROP PROCEDURE IF EXISTS `pr_insert_time_dura`$$CREATE DEFINER=`sd_prod`@`localhost` PROCEDURE `pr_insert_time_dura`( IN    iBegin_time   TIMESTAMP,   -- 开始时间
      IN    iEnd_time     TIMESTAMP,   -- 结束时间  IN    iDura         INT,         -- 统计间隔(分钟)
      OUT   oRowCount     INT
    )
        SQL SECURITY INVOKER
    BEGIN       
        /*
        declare vBegin_time TIMESTAMP;
        DECLARE vEnd_time TIMESTAMP;
        declare XX TIMESTAMP;
        declare vCount int; */
        
        SET @vBegin_time = SUBDATE(iBegin_time, INTERVAL iDura MINUTE);
        SET @vEnd_time = SUBDATE(iEnd_time, INTERVAL iDura MINUTE);
        SET @XX = @vBegin_time;
        SET @vCount = 0;
        
        -- 创建临时表
       DROP TABLE IF EXISTS tb_time_dura;    CREATE TABLE tb_time_dura(begin_time TIMESTAMP, end_time TIMESTAMP);
        
        WHILE @XX < @vEnd_time
        DO     
             INSERT INTO tb_time_dura(begin_time,end_time)
             SELECT @XX := ADDDATE(@XX,INTERVAL iDura MINUTE) BEGIN_TIME,
                    @YY := SUBDATE(ADDDATE(@XX,INTERVAL iDura MINUTE),INTERVAL 1 SECOND) END_TIME
             FROM DUAL;
             
             SET @vCount = @vCount + 1;
        END WHILE;
       SET @oRowCount = @vCount;       -- 可以内连接、左连接
       SELECT a.begin_time, a.end_time, COUNT(b.user_id) AS User_count   FROM tb_time_dura a   LEFT JOIN tb_user_login b   ON (b.login_time BETWEEN a.begin_time AND a.end_time)    GROUP BY a.begin_time, a.end_time;
    END$$DELIMITER ;-- 从2013-4-25 00:00:00开始,至2013-4-27 00:00:00结束,统计间隔为60分钟一次
    CALL pr_insert_time_dura('2013-4-25','2013-4-27',60, @rowcount);
    不知道是否符合楼主的要求