翼度科技»论坛 编程开发 mysql 查看内容

mysql5.7使用变量进行分组排名并实现筛选

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
概述

mysql到8.0之后就有rank和desc_rank函数了,但是在5.7没这玩意,想实现一个分组排名得靠自己手撸了.

分组排名
  1. student
复制代码
表就id/姓名/分数/班级几个字段,加上
  1. class
复制代码
表就id/name两个字段。
需求是查询每个班级分数排名前三的所有人(不是3个人是所有人)
  1. SELECT
  2. @last_class := st.class,
  3. CASE
  4.                
  5.         WHEN
  6.                 st.class = @last_class THEN
  7.                 CASE
  8.                                
  9.                                 WHEN @score = st.score THEN
  10.                                 @rank
  11.                                 WHEN ( @score := st.score ) IS NOT NULL THEN
  12.                                 @rank := @rank + 1
  13.                         END
  14.         ELSE @rank := 1
  15. END rank,
  16. st.*
  17. FROM
  18.         student st,(
  19.         SELECT
  20.                 @score := NULL,
  21.                 @rank := 0,
  22.                 @last_class := NULL
  23.         ) a
  24. ORDER BY
  25.         st.class,
  26.         st.score desc
复制代码
结果


筛选
  1. #EXPLAIN
  2. SELECT
  3.         a.id AS studentId,
  4.         NAME,
  5.         a.class,
  6.         a.score
  7. FROM
  8.         (
  9.         SELECT
  10.         @last_class := st.class,
  11.         CASE
  12.                        
  13.                 WHEN
  14.                         st.class = @last_class THEN
  15.                                 CASE
  16.                                        
  17.                                         WHEN @score = st.score THEN
  18.                                         @rank
  19.                                         WHEN ( @score := st.score ) IS NOT NULL THEN
  20.                                         @rank := @rank + 1
  21.                                        
  22.                                 END
  23.                 ELSE @rank := 1
  24.         END rank,
  25.         st.*
  26. FROM
  27.         student st,(
  28.         SELECT
  29.                 @score := NULL,
  30.                 @rank := 0,
  31.                 @last_class := NULL
  32.         ) aa
  33. ORDER BY
  34.         st.class,
  35.         st.score DESC
  36.         ) a
  37.        
  38.         where a.rank <= 3
复制代码
结果


总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

来源:https://www.jb51.net/database/320522u1a.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具