介绍mysql 的三种排名,由简到难

本文介绍如何使用MySQL进行排名查询,包括最简单的排名方法、考虑相同分数时的不同排名处理方式,并提供具体的SQL语句实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考连接

建表语句如下:

CREATE TABLE `score_test` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `score` decimal(10,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

插入数据:

insert  into `score_test`(`id`,`score`) values 
(1,10.00),
(2,20.40),
(3,23.70),
(4,2.87),
(5,3.87),
(6,23.87),
(7,10.00),
(8,10.00);

1.最简单的排名,不考虑排名一样的情况。

SELECT
  id,
  score,
  @rank := @rank+1
FROM
  score_test,
  (SELECT
    @rank := 0) r ORDER BY score;

结果:

解析:此处使用了mysql的变量,每查一次,变量就加1,"(SELECT @rank := 0) r " 这里是把设置变量也当成一个表,相当于整个语句是查两张表。


2.考虑排名一样的情况,分数一样排名就一样,但是名次只递增,比如有2个第一名,那么再往下就是第二名而不是第三名。

SELECT
  t.`id`,
  t.`score`,
  CASE
    WHEN @preRank = t.score
    THEN @curRank
    WHEN @preRank := t.score
    THEN @curRank := @curRank + 1
  END AS rank
FROM
  score_test t,
  (SELECT
    @curRank := 0,@preRank = NULL) r
ORDER BY t.`score`;

解析:  "WHEN @preRank := t.score" 经本人测试,这里会返回 true。

3.考虑排名一样的情况,分数一样排名就一样,但是名次跳级,比如有2个第一名,那么再往下就是第3名而不是第2名。

SELECT
  id,
  score,
  rank
FROM
  (SELECT
    id,
    score,
    @curRank := IF(
      @prevRank = score,
      @curRank,
      @incRank
    ) AS rank,
    @incRank := @incRank + 1,
    @prevRank := score
  FROM
    score_test,
    (SELECT
      @curRank := 0,
      @prevRank := NULL,
      @incRank := 1) r
  ORDER BY score) s



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值