依據登入表統計累計線上人數(登入表去重問題)
阿新 • • 發佈:2018-12-30
實現效果:
以上為測試資料
登入表 結構
使用者每登入一次就會往表中 插入一條資訊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
成功完成目標!!