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

解决方案 »

  1.   

    DROP TABLE IF EXISTS `o_user`;
    CREATE TABLE `o_user` (
      `user` varchar(255) DEFAULT NULL,
      `time` datetime DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
    -- Records of o_user
    -- ----------------------------
    INSERT INTO `o_user` VALUES ('zhang', '2016-07-14 09:06:46');
    INSERT INTO `o_user` VALUES ('lisi', '2016-07-14 09:07:58');
    INSERT INTO `o_user` VALUES ('wang', '2016-07-14 09:08:10');
    INSERT INTO `o_user` VALUES (null, null);
      

  2.   

    use dbi;DROP TABLE IF EXISTS `o_user`;
     CREATE TABLE `o_user` (
       `user` varchar(255) DEFAULT NULL,
       `time` datetime DEFAULT NULL
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `o_user` VALUES 
     ('a', '2016-07-14 09:06:46'),
     ('b', '2016-07-14 09:07:58'),
     ('a', '2016-07-14 09:11:10'),
     ('b', '2016-07-14 09:12:46'),
     ('a', '2016-07-14 10:07:58'),
     ('b', '2016-07-14 10:08:10'),
     ('b', '2016-07-14 10:18:10');
     
      select user, _g, min(time) as start_time, max(time) as finish_time
      from(
     select data.*
    , @i:=if(@u=user,if(time<@t, @i, @i+1), 1) as _g
        , @u:=user, @t:=time + INTERVAL 20 MINUTE  -- 持续在线的时间间隔
     from o_user data,(select @u:=null, @t:='0000-1-1') id
     order by data.user, data.time
      ) x group by user, _g
      

  3.   

    时长没有计算,我只算出了每个次在线的开始时间和结束时间
    反正知道开始和结束时间算时长很简单,结束时间-开始时间,如果不需要分时间段,对这个值做一个 SUM,你自己加上就好了
      

  4.   

    DROP TABLE IF EXISTS `o_user`;
    CREATE TABLE `o_user` (
      `user` varchar(255) DEFAULT NULL,
      `time` datetime DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    INSERT INTO `o_user` VALUES ('zhang', '2016-07-14 09:06:46');
    INSERT INTO `o_user` VALUES ('lisi', '2016-07-14 09:07:58');
    INSERT INTO `o_user` VALUES ('wang', '2016-07-14 09:08:10');
    INSERT INTO `o_user` VALUES ('zhang', '2016-07-14 09:16:46');
    INSERT INTO `o_user` VALUES ('lisi', '2016-07-14 09:47:58');
    INSERT INTO `o_user` VALUES ('zhang', '2016-07-14 09:46:46');
    INSERT INTO `o_user` VALUES ('lisi', '2016-07-14 09:57:58');
    INSERT INTO `o_user` VALUES ('zhang', '2016-07-14 09:56:46');select
    temp.user,sum(sum_time) as sum_time
    from(
    select
    m.*
    , @end:=time as endtime
    ,case when m.user=@user then round((@sum:=unix_timestamp(@end)-unix_timestamp(@begin))/60 ,0)
    else 0 end as sum_time
    ,@user:=m.user as temp_user 
    , @begin:=time  as begin_time
    from
      (select
      *
      from o_user
      order by user,time
    )m,
    (select  @user:='',@begin:=0,@end:=0,@sum:=0)n
    )temp where temp.sum_time<=20
    group by user 
      

  5.   

    思路:1.创建表,表作用是以用户名重新编排顺序,并获得新Id
    2.update一个id2,目的是将同一账号最相近的登录时间进行匹配
    3.取匹配的时间差,剔除大于要求的时间间隔,并汇总得到用户的登录时间。DROP TABLE IF EXISTS ut;CREATE TABLE ut (
      `id` INT(3) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `name` VARCHAR(10) DEFAULT NULL COMMENT '用户账户名',
      `opdate` DATETIME DEFAULT NULL COMMENT '用户操作时间',
      id2 INT(3) DEFAULT NULL COMMENT '与前ID一致',
      PRIMARY KEY (`id`)
    ) ENGINE=MYISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;INSERT ut(NAME,opdate) SELECT user,time FROM o_user ORDER BY user;UPDATE ut SET id2=id-1;SELECT a.name,a.opdate,SUM(IF(TIMESTAMPDIFF(MINUTE,a.opdate,b.opdate)>20,0,TIMESTAMPDIFF(MINUTE,a.opdate,b.opdate))) t FROM ut a
    JOIN ut b ON a.name=b.name AND a.id=b.id2
    GROUP BY a.name;