mysql查询排名前5的语句_MySQL语句实现排名

首先我们创建一张city_popularity表:

CREATE TABLEcity_popularity(

regionint(10) NOT NULL COMMENT '1 国内 2 海外',

city_nameVARCHAR(64) NOT NULL,

popularityDOUBLE(5,2) NOT NULL);

并向其中添加数据:

INSERT INTOcity_popularity (region, city_name, popularity)VALUES(1, '北京', 30.0),

(1, '上海', 30.0),

(1, '南京', 10.0),

(2, '伦敦', 20.0),

(1, '张家界', 8.0),

(2, '纽约', 35.0),

(1, '三亚', 25.0),

(2, '新加坡', 35.0);

创建出的表及数据如下:

fe922daa9cc39282bab5b8b0d6cb3f06.png

现在对所有城市的热门度进行排名:

1. 通过窗口函数

MySQL从8.0开始支持窗口函数,也叫分析函数,序号函数ROW_NUMBER(), RANK(), DENSE_RANK()满足不同需求的排序

SELECTregion, city_name, popularity,

ROW_NUMBER()OVER (PARTITION BY region ORDER BY popularity DESC) ASrankFROM city_popularity;

使用ROW_NUMBER()函数排序结果如下:

2c634a601bf370f8e59321a9f6312a2c.png

SELECTregion, city_name, popularity,

RANK()OVER (PARTITION BY region ORDER BY popularity DESC) ASrankFROM city_popularity;

使用RANK()函数排序结果如下:

cbd03ea2d0fb660ab80949c6738477c6.png

SELECTregion, city_name, popularity,

DENSE_RANK()OVER (PARTITION BY region ORDER BY popularity DESC) ASrankFROM city_popularity;

使用DENSE_RANK()函数排序结果如下:

64e203ad292dc2205ea766867ae8616e.png

2. 通过表的自交

SELECT a.region, a.city_name, a.popularity, (COUNT(b.popularity)+1) ASrankFROM city_popularity AS a LEFT JOIN city_popularity ASbON a.region = b.region AND a.popularity

以上通过表的自交实现了对国内和海外城市分别排序,且数据相同的情况,排名保持不变,且占有字符的排序:

3e23a4bd8cb966f85248e1a01bc00064.png

3. 通过设置变量

SELECT city_popularity.*,@rank := @rank+1 ASrankFROM city_popularity ,(SELECT @rank:=0) initORDER BY popularity DESC;

顺序排序,每多一条排序自增加一,结果如下:

510e6face9e05a76c08c649229bf20a3.png

select city_popularity.*,case when @popularity = popularity then @rank

when @popularity := popularity then @rank :=@rank+1

when @popularity =0 then @rank :=@rank+1 END asrankfrom city_popularity,(select @rank :=0,@popularity :=NULL) initORDER BY popularity DESC;

当数据相同时,排名一致,不相同则排名自增加一,结果如下:

fa76aef35cebad344fcb14a2fc431cae.png

select city_popularity.*,@rank1 :=@rank1+1,@rank :=

case when @popularity = popularity then @rank

when @popularity := popularity then @rank1

when @popularity =0 then @rank1 END asrankfrom city_popularity,(select @rank :=0,@popularity :=NULL,@rank1 :=0) initORDER BY popularity DESC;

数据相同的情况,排名保持不变,且占有字符,结果如下:

c47a01e778307e4af6ca8fa0bd16ad27.png

SELECT region, city_name, popularity, @rank:=@rank+1 ASrankFROM city_popularity, (SELECT @rank:=0) q ORDER BY popularity DESC;

3534093addd31ea75e7d602befc01650.png

参考链接:https://blog.csdn.net/justry_deng/article/details/80597916

https://blog.csdn.net/out_of_tune/article/details/90236270

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值