IT俱乐部 MySql mysql5.7使用变量进行分组排名并实现筛选

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

概述

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

分组排名

student表就id/姓名/分数/班级几个字段,加上class表就id/name两个字段。

需求是查询每个班级分数排名前三的所有人(不是3个人是所有人)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SELECT
@last_class := st.class,
CASE
         
    WHEN
        st.class = @last_class THEN
        CASE
                 
                WHEN @score = st.score THEN
                @rank
                WHEN ( @score := st.score ) IS NOT NULL THEN
                @rank := @rank + 1
            END
    ELSE @rank := 1
END rank,
st.*
FROM
    student st,(
    SELECT
        @score := NULL,
        @rank := 0,
        @last_class := NULL
    ) a
ORDER BY
    st.class,
    st.score desc

结果

筛选

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

结果

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持IT俱乐部。

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/database/mysql/11406.html
上一篇
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部