1. 程式人生 > >依據登入表統計累計線上人數(登入表去重問題)

依據登入表統計累計線上人數(登入表去重問題)

實現效果:

以上為測試資料

登入表 結構

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

成功完成目標!!