MySQL 排名、分组后组内排名、取各组的前几名 及排名后更新插入数据表中
一、排名
/*普通排名:从1开始,顺序往下排*/
SELECT cs.*,@r :=@r + 1 AS rank
FROM cs,(SELECT @r := 0) r
ORDER BY score;

/*并列排名:相同的值是相同的排名*/
SELECT cs.* ,
CASE
WHEN @p=score THEN @r
WHEN @p:=score THEN @r:=@r+1
END rank
FROM cs,(SELECT @r:=0,@p:=NULL)r
ORDER BY score;


/*并列排名:相同的值名次相同,与上例中的并列排名不同*/
SELECT city,score,rank
FROM
(
SELECT cs.*,
@c:=IF(@p=score,@c,@r) AS rank,
@p:=score,
@r:=@r+1
FROM cs ,(SELECT @p:=NULL,@r:=1,@c:=0)r
ORDER BY score
)c


二、分组后组内排名

/*分组普通排名:顺序排名*/
SELECT city,score,rank
FROM
(
SELECT cs.*,IF(@p=city,@r:=@r+1,@r:=1) AS rank,
@p:=city
FROM cs,(SELECT @p:=NULL,@r:=0)r
ORDER BY city,score
)s;
复制代码


/* 分组后并列排名:组内相同数值排名相同*/
SELECT city,score,rank
FROM
(
SELECT *,
IF(@p=city,
CASE
WHEN @s=score THEN @r
WHEN @s:=score THEN @r:=@r+1
END,
@r:=1 ) AS rank,
@p:=city,
@s:=score
FROM cs,(SELECT @p:=NULL,@s:=NULL,@r:=0)r
ORDER BY city,score
)s;


三、分组后取各组的前两名

/*取每组分数高的前两个,法一*/
SELECT city,score,rank
FROM
(
SELECT *,
IF(@p=city,
CASE
WHEN @s=score THEN @r
WHEN @s:=score THEN @r:=@r+1
END,
@r:=1 ) AS rank,
@p:=city,
@s:=score
FROM cs,(SELECT @p:=NULL,@s:=NULL,@r:=0)r
ORDER BY city,score DESC
)s
WHERE rank <3;


/*分组后取前两个,法二*/
SELECT * FROM cs c
WHERE (
SELECT count(*) FROM cs
WHERE city=c.city AND score>c.score )<2
ORDER BY city,score DESC

如何用mysql 查询出数据出数据排名,然后加编号;
表字段说明:查询e_Task_Result表 ,score代表分数,task_result_id 代表id
SELECT
(@rowNO := @rowNo+1) AS rowno,
task_result_id ,score FROM (
(SELECT task_result_id ,score FROM e_task_result ORDER BY score DESC) a,(SELECT @rowNo :=0) b )
如何将查询出来的排名更新到表中
表字段说明:查询e_Task_Result表 ,score代表分数,task_result_id 代表id,rank代表排名
UPDATE e_task_result d
LEFT JOIN (SELECT
(@rowNO := @rowNo+1) AS rowno,
task_result_id
FROM (SELECT
task_result_id
FROM e_task_result etr
ORDER BY task_result_status DESC,etr.score DESC,end_date) a,
(SELECT
@rowNO :=0) b) c
ON c.task_Result_id = d.task_result_id
SET d.rank = rowno
再如:
UPDATE
(SELECT @a := @a + 1 AS rank, user_code, task_type
FROM (
select * from user_score_quality
where task_type =1
ORDER BY user_score_quality.last_finish_task_num desc, user_score_quality.update_time asc
) h, (SELECT @a := 0 ) t
) t1, user_score_quality t2 SET t2.last_rank = t1.rank
WHERE t2.user_code = t1.user_code AND t2.task_type=t1.task_type
参考:
https://blog.csdn.net/w329636271/article/details/51751282
https://www.cnblogs.com/niniya/p/9046449.html
https://www.jianshu.com/p/bb1b72a1623e
http://blog.sina.com.cn/s/blog_4c197d420101e408.html
MySQL 排名、分组后组内排名、取各组的前几名 及排名后更新插入数据表中的更多相关文章
- MySQL 排名、分组后组内排名、取各组的前几名
一.排名 /*普通排名:从1开始,顺序往下排*/ AS rank ) r ORDER BY score; /*并列排名:相同的值是相同的排名*/ SELECT cs.* , CASE WHEN @p= ...
- mysql实现分组和组内序号
SELECT CASE WHEN @mid = t.PAY_TIME THEN ELSE END SEQ, @mid := t.PAY_TIME, t.AMOUNTS, t.CHARGE_PRICE, ...
- mysql存储过程之遍历多表记录后插入第三方表中
自从学过存储过程后,就再也没有碰过存储过程,这是毕业后写的第一个存储过程. 因为项目里设备的种类比较多,分别存在不同的数据表中,java中对应不同的java bean对象,想要统一管理有点困难.最近正 ...
- MySQL查询数据表中数据记录(包括多表查询)
MySQL查询数据表中数据记录(包括多表查询) 在MySQL中创建数据库的目的是为了使用其中的数据. 使用select查询语句可以从数据库中把数据查询出来. select语句的语法格式如下: sele ...
- (转)MySQL数据表中带LIKE的字符匹配查询
MySQL数据表中带LIKE的字符匹配查询 2014年07月15日09:56 百科369 MySQL数据表中带LIKE的字符匹配查询 LIKE关键字可以匹配字符串是否相等. 如果字段的值与指定的 ...
- mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法
[CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问 ...
- mysql进阶(五)数据表中带OR的多条件查询
MySQL数据表中带OR的多条件查询 OR关键字可以联合多个条件进行查询.使用OR关键字时: 条件 1) 只要符合这几个查询条件的其中一个条件,这样的记录就会被查询出来. 2) 如果不符合这些查询条件 ...
- 【MySQL】MySQL中查询出数据表中存在重复的值list
1.目的:查询MySQL数据表中,重复记录的值 2.示例: 3.代码: select serial_num,count(*) as count FROM card_ticket GROUP BY se ...
- Oracle 函数 “把当前的用户(审核人,审核通过后)插入到数据表中”
create or replace function mcode_apply_update_personnel(p_mca_no VARCHAR2, -- 参数(实参) p_action VARCHA ...
随机推荐
- 软件加密工具-Virbox 开发者工具盒
功能 Virbox 开发者工具盒是由深思数盾研发的一套软件加密工具,将加壳工具.API文档及操作流程文档等集成在一起,方便软件开发者使用. 您可以通过 Virbox 开发者工具盒实现: dll.exe ...
- Kafka实践1--Producer
一.Kafka设计原理参考: http://blog.csdn.net/suifeng3051/article/details/48053965?locationNum=2 http://www.cn ...
- select,poll,epoll
1. Epoll 是何方神圣? Epoll 可是当前在 Linux 下开发大规模并发网络程序的热门人选, Epoll 在 Linux2.6 内核中正式引入,和 select 相似,其实都 I/O 多路 ...
- 八、UIViewController们之间的协作——Segue
概述 正所谓“一生二,二生三,三生万物”,1个UIViewController没什么花样,多个UIViewController相互协作就有了各式各样丰富多彩的APP.但是UIViewControlle ...
- 微信小程序组件封装
第一步,在page下面新建一个template文件,如下图 第二部,在template.wxml中编写公用组件即要封装的代码模块 <!--pages/template/template.wxml ...
- 关于SLG的产品市场判断
SLG游戏是我自己主攻的未来产品方向,以下几个板块是我自己想着力挖掘的用户艺术: 1)经营能力(包括资源的规划,调配,成长性预期,以及投产比如何向用户选择向最大化) 2)统筹能力(包括自我资源的有效整 ...
- tiny6410的启动参数
bootargs=root=/dev/mtdblock2 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200 bootcmd=nand led ...
- 单源最短路——Dijkstara算法
算法基本思想:每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径. 1.将所有的顶点分为两个部分:已知最短路程的顶点集合P和未知最短路径的顶点集合Q 2.设置 ...
- Unable to construct api.Node object for kubelet: can't get ip address of node master.example.com: lookup master.example.com on : no such host
openshift首页进不去 启动openshift时报的错,大意是: 无法为kubelet构造api.Node对象:无法获取节点master.example.com的IP地址: 所以就联想到新装的c ...
- 剑指offer(32)把数组排成最小的数
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 题目分析 主 ...