Mysql 分数排名查询

说明:查询分数排名前三的同学及分数信息。

表结构

user
[图片]

score
[图片]

结果

[图片]

[图片]

SQL 语句

1. 常规方法

使用临时变量计算排名相关信息。
prescore 用于记录上一次的分数,用于比较是不是同名词。
r 用于记录排名。
c 用于记录同名次排名产生的计数差值。

SELECT `user`.id, `user`.`name`,v.score, v.Ran
FROM `user`,
(
SELECT user_id,score,
        @r := IF( @prescore = score, @r, @r + @c + 1) AS Ran,
        @c := IF( @prescore = score, @c + 1, 0) AS cc,
        @prescore := score.score 
        FROM score,
        ( SELECT @prescore := NULL, @r := 0, @c := 0 ) rv 
        ORDER BY score DESC
        ) v
WHERE `user`.id = v.user_id
AND v.Ran < 4

2. 使用 Mysql RANK()函数

RANK() 函数简介

RANK() 函数为结果集的分区中的每一行分配一个排名。行的等级由一加上前面的等级数指定。
以下显示了RANK()函数的语法:

RANK() OVER (
    PARTITION BY <expression>[{,<expression>...}]
    ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
) 

在这个语法中:

  • 首先,PARTITION BY子句将结果集划分为分区。RANK()功能在分区内执行,并在跨越分区边界时重新初始化。
  • 其次,ORDER BY子句按一个或多个列或表达式对分区内的行进行排序。
    ROW_NUMBER()函数不同,RANK()函数并不总是返回连续的整数。

SQL

SELECT
        * 
FROM
        (
        SELECT
                `user`.id,
                `user`.`name`,
                score.score,
                RANK() over ( ORDER BY score.score DESC ) AS ran 
        FROM
                score,
                `user` 
        WHERE
                `user`.id = score.user_id 
        ) v 
WHERE
        v.ran < 4
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值