MySQL查询各科成绩前三名的记录及排名(不考虑成绩并列情况)
MySQL查询各科成绩前三名的记录及排名(不考虑成绩并列情况)
我的表结构:
先放代码
-- 查询各科成绩前三名的记录(不考虑成绩并列情况)
SELECT
sc1.`s_id`,
sc1.`c_id`,
sc1.`s_score`,
(SELECT
COUNT(*)
FROM
score sc3
WHERE
sc3.`c_id` = sc1.`c_id`
AND sc3.`s_score` > sc1.`s_score`
)+1 AS rank
FROM
score sc1
LEFT JOIN
score sc2
ON
sc1.`c_id` = sc2.`c_id`
AND sc1.`s_score` < sc2.`s_score`
GROUP BY
sc1.`c_id`,
sc1.`s_id`,
sc1.`s_score`
HAVING
COUNT(sc2.`s_id`) <= 2
ORDER BY
sc1.`c_id`,
sc1.`s_score` DESC
思路:
首先是创建相同的sc1和sc2,根据sc1.c_id左外连接在一起,并且条件是
FROM
score sc1
LEFT JOIN
score sc2
ON
sc1.`c_id` = sc2.`c_id`
AND sc1.`s_score` < sc2.`s_score`
-- 意思是在sc2找出相同课程但分数比sc1更高的行
这时脑海里应该有这么个图了(脑海里排序之后):
可以看到右边sc2列的都是分数大于sc1的情况
然后就可以进行三次分组,
GROUP BY
sc1.`c_id`,
sc1.`s_id`,
sc1.`s_score`
三次分组之后就是得到上面那个图的每个红色框框缩为一行的情况
然后就应该只能sc2中允许有两个以下的人比sc1高对吧,如果有3个比sc1高那就是第四名了,所以分组是有条件的
HAVING
COUNT(sc2.`s_id`) <= 2
好,到目前为止我们已经找出了每科前三的各行数据了,接下来排序整理就可以得到最终结果了
ORDER BY
sc1.`c_id`,
sc1.`s_score` DESC
最终结果:
另外,如果要增加排名的话,可以在查询结果集添加
(SELECT
COUNT(*)
FROM
score sc3
WHERE
sc3.`c_id` = sc1.`c_id`
AND sc3.`s_score` > sc1.`s_score`
)+1 AS rank
找出比同课程sc1.s_score高分的人数+1就是排名了,最终结果:
MySQL查询各科成绩前三名的记录及排名(不考虑成绩并列情况)相关教程
慢查询与分析
慢查询与分析 一慢查询 set global log_output = 'FILE,TABLE'; set global slow_query_log = 'ON';set global long_query_time =0.001;set GLOBAL log_queries_not_using_indexes = 'ON'; //没有使用索引的字段SELECT * from `mysql`.slow_log;//查看慢查询
mybatis--mybatis的介绍(模糊查询,配置文件的使用,注意事项)
mybatis--mybatis的介绍(模糊查询,配置文件的使用,注意事项) mybatis (1)Mybatis是什么? MyBatis 本是apache的一个开源项目iBatis,是一个基于Java的持久层框架 (2)Mybatis有什么特点? 1 最简单安装只要两个jar文件+配置几个sql映射文件 2 sql写在x
docker这样配置mysql数据库的映射是连不上的,坑!!!
docker这样配置mysql数据库的映射是连不上的,坑!!! docker这样配置mysql数据库的映射是连不上的,坑!!! 因为我docker中已经安装了一个mysql了如图: 但因为版本是最新的latest,而我现在要装一个5.5版本的mysql. 开始觉得挺简单,重新开一个容器就可以
Managing Big Data with MySQL学习笔记
Managing Big Data with MySQL学习笔记 Managing Big Data with MySQL学习笔记 Intro Week 1 How Relational Databases Help Solve Those Problems Database Design Tools Entity-Relationship Diagram Relational Schemas SQL: 关系型数据库( MySQL, Terada
mysql常用的函数
mysql常用的函数 1、IF(expr1,expr2,expr3)函数: 如果 expr1 是TRUE ,则 IF()的返回值为expr2; 否则返回值则为 expr3。 IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。 例: 2、IFNULL(expr1,expr2)函数: 如果expr1 不为 NULL,则 IFNULL()
Mysql优化
Mysql优化 一、优化思路: 1、设计3NF即表设计要满足三范式。 2、优化配置文件参数(my.ini|f)。 3、使用存储过程、视图、触发器,结合定时任务。 4、分隔表:水平分隔、垂直分隔。 5、读写分离。 6、增量备份:对无用的历史数据进行定期备份。 7、sql语
mysql基础三 触发器
mysql基础三 触发器 商品表 -- Table goods DDL: CREATE TABLE goods ( gid int(11) NOT NULL, name varchar(20) DEFAULT NULL, num smallint(6) DEFAULT NULL, PRIMARY KEY ( gid ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 订单表 -- Table orders DDL: CR
ES 实现实时从Mysql数据库中读取热词,停用词
ES 实现实时从Mysql数据库中读取热词,停用词 IK分词器虽然自带词库 但是在实际开发应用中对于词库的灵活度的要求是远远不够的,IK分词器虽然配置文件中能添加扩展词库,但是需要重启ES 这章就当写一篇扩展了 其实IK本身是支持热更新词库的,但是需要我感觉不是很
MySQL 查询学生的总成绩并进行排名_MySQL查询各科成绩前三名的记录及排名(不考虑成绩并列情况)...