建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
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);
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
反正知道开始和结束时间算时长很简单,结束时间-开始时间,如果不需要分时间段,对这个值做一个 SUM,你自己加上就好了
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
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;