当前位置: 首页 > news >正文

mysql8.0查询等级排名可使用窗口函数,那5.7的版本呢?

1、需求:查询用户详情的同时查询用户的排名

在这里插入图片描述

2、首先看下数据库表设计

分为会员用户表member_user和会员等级表member_level,升级的条件是根据经验值升级,表结构如下:

用户表 member_user
CREATE TABLE `member_user` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',`mobile` varchar(11) DEFAULT NULL COMMENT '手机号',`status` tinyint(4) NOT NULL COMMENT '状态',`nickname` varchar(30) NOT NULL DEFAULT '' COMMENT '用户昵称',`avatar` varchar(512) NOT NULL DEFAULT '' COMMENT '头像',`sex` tinyint(4) DEFAULT '0' COMMENT '用户性别',`level_id` bigint(20) DEFAULT NULL COMMENT '等级编号',`experience` int(11) NOT NULL DEFAULT '0' COMMENT '经验',`entry_time` datetime DEFAULT NULL COMMENT '入职时间',`hobbies` varchar(200) DEFAULT NULL COMMENT '兴趣爱好',`brief` varchar(300) DEFAULT NULL COMMENT '简介'PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=304 DEFAULT CHARSET=utf8mb4 COMMENT='会员用户';
会员等级表 member_level
CREATE TABLE `member_level` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',`name` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '等级名称',`level` int(11) NOT NULL DEFAULT '0' COMMENT '等级',`experience` int(11) NOT NULL DEFAULT '0' COMMENT '升级经验',`icon` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '等级图标',`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态'PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会员等级';

3、根据用户id查询排名

基于等级 level_id和经验 experience 进行排序,sql如下:

3.1、mysql 8.0以上可使用窗口函数
SELECTmu.id,mu.nickname,mu.avatar,ml.name AS level_name,mu.experience,RANK() OVER (ORDER BY ml.level DESC, mu.experience DESC) AS level_rank
FROMmember_user mu
JOINmember_level ml ON mu.level_id = ml.id
WHEREmu.id = #{id};

解释:
1、SELECT 子句:选择我们需要的字段,包括会员 ID (member_id)、会员昵称 (member_nickname)、等级名称 (level_name)、经验 (experience),以及计算的排名 (level_rank)。
2、JOIN 语句:通过 level_id 将 member_user 表与 member_level 表连接起来。这样可以获取会员对应的等级名称和等级详细信息。
3、RANK() OVER:这是一个窗口函数,用来根据指定的排序规则对查询结果进行排名。在这里,我们首先按 level (等级) 降序排序,然后按 experience (经验) 降序排序。

以上sql没问题,可我使用的是 mysql 5.7 版本,不支持窗口函数,难道必须升级吗?升级过程出问题了咋整?好的,对症下药,多写两颗代码就搞定。
3.2、mysql 5.7 及更早版本不支持窗口函数。在这种情况下,我们可以使用子查询来实现类似的排名功能
SELECTmu.id,mu.nickname,mu.avatar,ml.name AS level_name,mu.experience,(SELECT COUNT(*) + 1FROM member_user mu2JOIN member_level ml2 ON mu2.level_id = ml2.idWHERE (ml2.level > ml.level) OR (ml2.level = ml.level AND mu2.experience > mu.experience)) AS level_rank
FROMmember_user mu
JOINmember_level ml ON mu.level_id = ml.id
WHEREmu.id = #{id};

子查询的工作原理
1、子查询:在主查询的每一行上,子查询都会计算出比当前会员等级高或等级相同但经验更高的会员数量。
2、排名:将子查询的结果加 1 就是当前会员的排名。

总结

根据你的 MySQL 版本选择合适的解决方案。愿你大吉大利,没有bug。如果还有问题,欢迎讨论!


http://www.mrgr.cn/news/14913.html

相关文章:

  • 设计模式-简单工厂模式工厂方法模式
  • cesium模型加载-点击-高亮
  • 自定义全局变量在uniapp的Vuex应用
  • 数字三角形
  • BITCN合集(BITCN 、BITCN-GRU、BITCN-BIGRU、BITCN-LSTM、BITCN-BILSTM、BITCN-SVM)
  • 装饰器(Decorators)的实现
  • 基于RK3588+MCU智能清洁车应用解决方案
  • erlang学习:用OTP构建系统2,警报管理
  • CTF密码学小结
  • 面试题集锦:数据库
  • 在随机点实现凸包包围游戏地区
  • 电商模式的解析
  • 【Python机器学习】NLP词频背后的含义——从词频到主题得分
  • 2.3 阿里巴巴-背包问题
  • 跨链互通:Web3如何实现多链互操作性
  • 如何用Java SpringBoot+Vue打造摇滚乐鉴赏网站:从设计到实现全解析
  • helm学习第四篇-微服务组件的加入
  • 从“养老社区、居家健康”迈向“全生活场景”,保险+康养步入3.0时代!
  • centos基础设置
  • k8s探针详细学习笔记