伍昌军 发表于 2024-5-26 09:31:14

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

概述

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

分组排名

student表就id/姓名/分数/班级几个字段,加上class表就id/name两个字段。
需求是查询每个班级分数排名前三的所有人(不是3个人是所有人)
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结果


筛选

#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 <= 3结果


总结

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

来源:https://www.jb51.net/database/320522u1a.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: mysql5.7使用变量进行分组排名并实现筛选