依据登录表统计累计在线人数(登录表去重问题)

实现效果:


以上为测试数据


登录表 结构

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

成功完成目标!!



有多种方式可以实现统计网站累计访问人数,其中一种常见的方式是利用 Spring Boot 提供的监听器。 具体实现步骤如下: 1. 创建一个自定义的 ServletContextListener 监听器,用于统计网站的访问人数。 2. 在 ServletContextListener 中,使用 ServletContext 对象获取网站的全局作用域对象,从中获取累计访问人数并进行更新。 3. 在 Spring Boot 的启动类中注册刚才创建的监听器。 示例代码如下: ```java @Component public class MyServletContextListener implements ServletContextListener { private int visitCount = 0; @Override public void contextInitialized(ServletContextEvent sce) { ServletContext servletContext = sce.getServletContext(); servletContext.setAttribute("visitCount", visitCount); } @Override public void contextDestroyed(ServletContextEvent sce) { ServletContext servletContext = sce.getServletContext(); servletContext.removeAttribute("visitCount"); } @Override public void sessionCreated(HttpSessionEvent se) { ServletContext servletContext = se.getSession().getServletContext(); Integer count = (Integer) servletContext.getAttribute("visitCount"); visitCount = count == null ? 1 : count + 1; servletContext.setAttribute("visitCount", visitCount); } @Override public void sessionDestroyed(HttpSessionEvent se) { } } ``` 在启动类中注册监听器: ```java @SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.listeners(new MyServletContextListener()); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 这样,每当有用户访问网站时,就会调用 MyServletContextListener 中的 sessionCreated 方法,从而更新累计访问人数。可以通过 ServletContext 对象获取当前网站的累计访问人数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值