sql语句查询排名

思路:有点类似循环里面的自增一样,设置一个变量并赋予初始值,循环一次自增加1,从而实现排序;

   mysql里则是需要先将数据查询出来并先行按照需要排序的字段做好降序desc,或则升序asc,设置好排序的变量(初始值为0):

   a>.将已经排序好的数据从第一条依次取出来,取一条就自增加一,实现从1到最后的一个排名

   b>.当出现相同的数据时,排名保持不变,此时则需要再设置一个变量,用来记录上一条数据的值,跟当前数据的值进行对比,如果相同,则排名不变,不相同则排名自增加1

   c.当出现相同的数据时,排名保持不变,但是保持不变的排名依旧会占用一个位置,也就是类似于(1,2,2,2,5)这种排名就是属于中间的三个排名是一样的,但是第五个排名按照上面一种情况是(1,2,2,2,3),现在则是排名相同也会占据排名的位置

准备数据(用户id,分数):

CREATE TABLE `sql_rank` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`user_id` int(11) unsigned NOT NULL,

`score` tinyint(3) unsigned NOT NULL,

`add_time` date NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

插入数据:

INSERT INTO sql_rank (user_id, score, add_time)

VALUES

(100, 50, '2016-05-01'),

(101, 30, '2016-05-01'),

(102, 20, '2016-05-01'),

(103, 60, '2016-05-01'),

(104, 80, '2016-05-01'),

(105, 50, '2016-05-01'),

(106, 70, '2016-05-01'),

(107, 85, '2016-05-01'),

(108, 60, '2016-05-01')

当前数据库数据:

一、sql1{不管数据相同与否,排名依次排序(1,2,3,4,5,6,7.....)}

SELECT

obj.user_id,obj.score,@rownum := @rownum + 1 AS rownum

FROM

(

SELECT

user_id,

score

FROM

`sql_rank`

ORDER BY

score DESC

) AS obj,

(SELECT @rownum := 0) r

执行的结果如下图:

  

可以看到,现在按照分数从1到9都排好序了,但是有些分数相同的用户排名却不一样,这就是接下来要说的第二种sql

二、sql2{只要数据有相同的排名就一样,排名依次排序(1,2,2,3,3,4,5.....)}

SELECT

obj.user_id,

obj.score,

CASE

WHEN @rowtotal = obj.score THEN

@rownum

WHEN @rowtotal := obj.score THEN

@rownum :=@rownum + 1

WHEN @rowtotal = 0 THEN

@rownum :=@rownum + 1

ENDAS rownum

FROM

(

SELECT

user_id,

score

FROM

`sql_rank`

ORDER BY

score DESC

) AS obj,

(SELECT @rownum := 0 ,@rowtotal := NULL) r

这时候就新增加了一个变量,用于记录上一条数据的分数了,只要当前数据分数跟上一条数据的分数比较,相同分数的排名就不变,不相同分数的排名就加一,并且更新变量的分数值为该条数据的分数,依次比较

如下图结果:

  

跟第一条sql的结果相对比你会发现,分数相同的排名也相同,并且最后一名的名次由第9名变成了第7名;

如果你需要分数相同的排名也相同,但是后面的排名不能受到分数相同排名相同而不占位的影响,也就是哪怕你排名相同,你也占了这个位置(比如:1,2,2,4,5,5,7....这种形式的,虽然排名有相同,但是你占位了,后续的排名根据占位来排)

三、sql2{只要数据有相同的排名就一样,但是相同排名也占位,排名依次排序(1,2,2,4,5,5,7.....)}  

   此时需呀再增加一个变量,来记录排序的号码(自增)

SELECT

obj_new.user_id,

obj_new.score,

obj_new.rownum

FROM

(

SELECT

obj.user_id,

obj.score,

@rownum := @rownum + 1 AS num_tmp,

@incrnum := CASE

WHEN @rowtotal = obj.score THEN

@incrnum

WHEN @rowtotal := obj.score THEN

@rownum

ENDAS rownum

FROM

(

SELECT

user_id,

score

FROM

`sql_rank`

ORDER BY

score DESC

) AS obj,

(

SELECT

@rownum := 0 ,@rowtotal := NULL ,@incrnum := 0

) r

) AS obj_new

上面sql执行的结果如下:

  

  结果集中分数相同的,排名相同,同时它也占据了那个位置,中间的一个数据过程本人截图了,请往下看(跟上图做对比你就明白了):

  

mysql:查询排名相关推荐

  1. MySQL 查询排名

    参考:http://fellowtuts.com/mysql/query-to-obtain-rank-function-in-mysql 前段时间看到个帖子,是关于用 SQL 查询排名的. 那个帖子 ...

  2. MySql 查询排名前10(包含并列)Sql

    今天一个测试的朋友去面试,考察了她数据库查询的一些语法问题,但是一些细节她没有考虑进去被刷下了.果然行业标准提高了啊. 贴一下笔试题目. –1.学生表 Student(SId,Sname,Sage,S ...

  3. MySQL 查询学生的总成绩并进行排名_MySQL查询各科成绩前三名的记录及排名(不考虑成绩并列情况)...

    MySQL查询各科成绩前三名的记录及排名(不考虑成绩并列情况) MySQL查询各科成绩前三名的记录及排名(不考虑成绩并列情况) 我的表结构: 先放代码 -- 查询各科成绩前三名的记录(不考虑成绩并列情 ...

  4. mysql 查询字段排名_mysql:查询排名

    sql语句查询排名 思路:有点类似循环里面的自增一样,设置一个变量并赋予初始值,循环一次自增加1,从而实现排序: mysql里则是需要先将数据查询出来并先行按照需要排序的字段做好降序desc,或则升序 ...

  5. mysql 查询成绩排名_mysql 学生成绩查询排名

    sql语句查询排名 思路:有点类似循环里面的自增一样,设置一个变量并赋予初始值,循环一次自增加1,从而实现排序: mysql里则是需要先将数据查询出来并先行按照需要排序的字段做好降序desc,或则升序 ...

  6. MySql排序并查询排名

    MySql排序并查询排名 SELECT u.uid,u.name,u.score, @rownum := @rownum + 1 AS rownum FROM (SELECT @rownum := 0 ...

  7. mysql作排名,MYSQL实现排名及查询指定用户排名功能(并列排名功能)实例代码...

    前言 本文主要介绍了关于MYSQL实现排名及查询指定用户排名功能(并列排名功能)的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 表结构: CREATE TABLE test ...

  8. mysql查询成绩排名

    mysql查询成绩排名 表: create table study.sort_table (name varchar(20) null comment '姓名',score int null comm ...

  9. mysql排名第一_SQL查询排名第二名的信息

    今天看见同学去面试的面试题,查询出某个字段排名第二名的信息,自己就看看 如果是Oracle ,这不就是考察Oracle分页么,以Oracle的emp表为例,根据薪水排名,查询排名第二的员工信息: se ...

最新文章

  1. 2015中学计算机考试题,2017年初中信息技术考试试题及答案
  2. 我治大学生抄作业毛病的办法——兼答丁又专老师
  3. SSH-jar包相应作用
  4. LeetCode Algorithm 746. 使用最小花费爬楼梯
  5. 华为拿百亿资金给员工分红,预计每股1.58元
  6. tableexport 文件格式和扩展名不匹配_让信息检索更有效率!百度有哪些你不知道的隐藏玩法?...
  7. linux邮件客户端软件,适用于Linux的4款最佳电子邮件客户端 | MOS86
  8. 东芝移动硬盘拆解图_拆解报告:小米USB 3.0分线器XMFXQ01QM
  9. python 获取macd数据_60分钟MACD数据如何获取
  10. 【应届生必看】技术岗面试应答有哪些话术和技巧?
  11. OutOfMemoryError(OOM)和StackOverflowError(SOF)异常总结
  12. 使用AcronisTrueImage 2020迁移thinkpad x1 carbon 2016(4th gen) win10系统到1t的固态硬盘970evoPlus的过程
  13. python魔方方法超详细介绍
  14. ribbon服务列表和nacos服务列表不一致的问题
  15. 四六级英语听力发射无线广播系统在广东海洋大学阳江校区的应用
  16. 如何给驱动程序签名?怎么做微软WHQL认证?
  17. ROS入门21讲---ROS命令行工具的使用
  18. Python 爬虫 之 爬取王者荣耀的英雄们所有大皮肤图片,并 json 形式保存英雄列表信息到本地
  19. leaflet通过经纬度定位_javascript – 如何使用Leaflet API从纬度和经度坐标检索LayerPoint(X,Y)...
  20. pandas 分列(二)之不规则字符串及str.extract()

热门文章

  1. 陆小曼给徐志摩的挽联
  2. [办公软件]怎么在WPS表格里设置完成率公式?
  3. IOS安全测试学习-DVIA-v2
  4. xp计算机管理 查看,Windows XP中如何查看计算机开关机记录系统管理| Windows | NoUnix.com...
  5. vue饿了么项目实现评论列表的筛选
  6. 【数据结构】- 教你一步完美应对面试官让你10分钟内实现带头双向循环链表(下)
  7. 《JavaScript交互式网页设计》复习考试
  8. invoice-message【发票样式模板】使用
  9. QUIC linux编译
  10. 计算机图形学——游戏方向 第一章 计算机图形学概述