mysql:查询排名
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:查询排名相关推荐
- MySQL 查询排名
参考:http://fellowtuts.com/mysql/query-to-obtain-rank-function-in-mysql 前段时间看到个帖子,是关于用 SQL 查询排名的. 那个帖子 ...
- MySql 查询排名前10(包含并列)Sql
今天一个测试的朋友去面试,考察了她数据库查询的一些语法问题,但是一些细节她没有考虑进去被刷下了.果然行业标准提高了啊. 贴一下笔试题目. –1.学生表 Student(SId,Sname,Sage,S ...
- MySQL 查询学生的总成绩并进行排名_MySQL查询各科成绩前三名的记录及排名(不考虑成绩并列情况)...
MySQL查询各科成绩前三名的记录及排名(不考虑成绩并列情况) MySQL查询各科成绩前三名的记录及排名(不考虑成绩并列情况) 我的表结构: 先放代码 -- 查询各科成绩前三名的记录(不考虑成绩并列情 ...
- mysql 查询字段排名_mysql:查询排名
sql语句查询排名 思路:有点类似循环里面的自增一样,设置一个变量并赋予初始值,循环一次自增加1,从而实现排序: mysql里则是需要先将数据查询出来并先行按照需要排序的字段做好降序desc,或则升序 ...
- mysql 查询成绩排名_mysql 学生成绩查询排名
sql语句查询排名 思路:有点类似循环里面的自增一样,设置一个变量并赋予初始值,循环一次自增加1,从而实现排序: mysql里则是需要先将数据查询出来并先行按照需要排序的字段做好降序desc,或则升序 ...
- MySql排序并查询排名
MySql排序并查询排名 SELECT u.uid,u.name,u.score, @rownum := @rownum + 1 AS rownum FROM (SELECT @rownum := 0 ...
- mysql作排名,MYSQL实现排名及查询指定用户排名功能(并列排名功能)实例代码...
前言 本文主要介绍了关于MYSQL实现排名及查询指定用户排名功能(并列排名功能)的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 表结构: CREATE TABLE test ...
- mysql查询成绩排名
mysql查询成绩排名 表: create table study.sort_table (name varchar(20) null comment '姓名',score int null comm ...
- mysql排名第一_SQL查询排名第二名的信息
今天看见同学去面试的面试题,查询出某个字段排名第二名的信息,自己就看看 如果是Oracle ,这不就是考察Oracle分页么,以Oracle的emp表为例,根据薪水排名,查询排名第二的员工信息: se ...
最新文章
- 2015中学计算机考试题,2017年初中信息技术考试试题及答案
- 我治大学生抄作业毛病的办法——兼答丁又专老师
- SSH-jar包相应作用
- LeetCode Algorithm 746. 使用最小花费爬楼梯
- 华为拿百亿资金给员工分红,预计每股1.58元
- tableexport 文件格式和扩展名不匹配_让信息检索更有效率!百度有哪些你不知道的隐藏玩法?...
- linux邮件客户端软件,适用于Linux的4款最佳电子邮件客户端 | MOS86
- 东芝移动硬盘拆解图_拆解报告:小米USB 3.0分线器XMFXQ01QM
- python 获取macd数据_60分钟MACD数据如何获取
- 【应届生必看】技术岗面试应答有哪些话术和技巧?
- OutOfMemoryError(OOM)和StackOverflowError(SOF)异常总结
- 使用AcronisTrueImage 2020迁移thinkpad x1 carbon 2016(4th gen) win10系统到1t的固态硬盘970evoPlus的过程
- python魔方方法超详细介绍
- ribbon服务列表和nacos服务列表不一致的问题
- 四六级英语听力发射无线广播系统在广东海洋大学阳江校区的应用
- 如何给驱动程序签名?怎么做微软WHQL认证?
- ROS入门21讲---ROS命令行工具的使用
- Python 爬虫 之 爬取王者荣耀的英雄们所有大皮肤图片,并 json 形式保存英雄列表信息到本地
- leaflet通过经纬度定位_javascript – 如何使用Leaflet API从纬度和经度坐标检索LayerPoint(X,Y)...
- pandas 分列(二)之不规则字符串及str.extract()
热门文章
- 陆小曼给徐志摩的挽联
- [办公软件]怎么在WPS表格里设置完成率公式?
- IOS安全测试学习-DVIA-v2
- xp计算机管理 查看,Windows XP中如何查看计算机开关机记录系统管理| Windows | NoUnix.com...
- vue饿了么项目实现评论列表的筛选
- 【数据结构】- 教你一步完美应对面试官让你10分钟内实现带头双向循环链表(下)
- 《JavaScript交互式网页设计》复习考试
- invoice-message【发票样式模板】使用
- QUIC linux编译
- 计算机图形学——游戏方向 第一章 计算机图形学概述