实现效果:
以上为测试数据
登录表 结构
CREATE TABLE `d_user_login` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自动编号',
`uid` bigint(20) NOT NULL COMMENT '用户id',
`account` varchar(32) NOT NULL COMMENT '用户名',
`name` varchar(32) NOT NULL, COMMENT '昵称'
`type` tinyint(4) NOT NULL COMMENT '类型0-登录,1-登出',
`level` smallint(6) NOT NULL COMMENT '等级',
`money` bigint(20) NOT NULL COMMENT '元宝',
`diamond` int(11) NOT NULL COMMENT '钻石',
`purple` int(11) NOT NULL COMMENT '紫水晶',
`green` int(11) NOT NULL COMMENT '绿水晶',
`score` int(11) NOT NULL COMMENT '积分',
`totalDiamond` int(11) NOT NULL COMMENT '累计钻石',
`time` datetime NOT NULL COMMENT '发生时间',
`annex` varchar(600) NOT NULL COMMENT '拓展信息',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
用户每登录一次就会往表中 插入一条信息
需求是将每个小时的登录人数计算出来(难点某用户第1,5,8小时都登录了 每小时去重并且出现过一次的uid 不再进行统计)
笔者也是搞了 老半天
笔者刚开始测试语句:
select count(DISTINCT(uid)) as onl from `d_user_login201704` where type=0 and time >='2017-04-09 00:00:00' and time<='2017-04-09 23:59:59';
进行以小时分组
select count(DISTINCT(uid)) as onl,date_format(time,'%H') as hour from `d_user_login201704` where type=0 and time >='2017-04-09 00:00:00'
and time<='2017-04-09 23:59:59' GROUP BY hour;
得出的结果不如人意 这里的去重只是以小时为单位去重了 要得要我们想要的效果还需要努力!
经过一番努力
笔者得出了成功sql
select count(uid) as onl,date_format(time,'%H') as hour from d_user_login201704 where id in (select * from ((select min(id) from d_user_login201704 where
type=0 and time>= '2017-04-09 00:00:00' and time<='2017-04-09 23:59:59' group by(uid)) as tmptable)) group by hour;
相加结果却是等于11408
成功完成目标!!