留存—

参考地址
数据准备:

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (`id` varchar(32) DEFAULT NULL,`name` varchar(30) DEFAULT NULL,`subject` varchar(30) DEFAULT NULL,`score` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据

INSERT INTO `test` VALUES ('1', '张三', '语文', '98');
INSERT INTO `test` VALUES ('2', '张三', '数学', '80');
INSERT INTO `test` VALUES ('3', '张三', '英语', '90');
INSERT INTO `test` VALUES ('4', '李四', '语文', '88');
INSERT INTO `test` VALUES ('5', '李四', '数学', '86');
INSERT INTO `test` VALUES ('6', '李四', '英语', '88');
INSERT INTO `test` VALUES ('7', '李明', '语文', '60');
INSERT INTO `test` VALUES ('8', '李明', '数学', '86');
INSERT INTO `test` VALUES ('9', '李明', '英语', '88');
INSERT INTO `test` VALUES ('10', '林风', '语文', '74');
INSERT INTO `test` VALUES ('11', '林风', '数学', '99');
INSERT INTO `test` VALUES ('12', '林风', '英语', '59');
INSERT INTO `test` VALUES ('13', '严明', '英语', '96')

方法一

先给每科成绩排名,也就是表中两个条件,一是科目一样,在此之下,算出比自己score分数高的人数和sum,则sum+1就是自己的名次;
首先sum 的算法:主体为一张表,去镶嵌一个排名,
select t1.* ,排名,from test t1;

排名:逻辑 --并不能运行

SELECT count(*) + 1 FROM test  WHERE test.subject = test.subject AND test.score < test.score

之后就考虑区分表
这边的t1.score<t2.score是因为主表(被比较表)是t1,t2中有几条数据能比t1大,加一则是排名

select  t1.* ,(SELECT count(*) + 1 FROM test  t2  WHERE t1.subject = t2.subject AND t1.score
< t2.score) as top from test t1;

加上排序 order by subject score

select  t1.* ,(SELECT count(*) + 1 FROM test  t2  WHERE t1.subject = t2.subject AND t1.score
< t2.score) as top from test t1 order by subject,score

结果:

接下来是取前三条数据:
加一个having,这里这种方法就是按人头算名次,并列第2则没有第三名

select t1.*,(select count(*)+1 from test t2 where t2.subject = t1.subject and t2.score > t1.score)as top
from test t1 HAVING top <4 order BY
subject,score desc

方法一.2

一样,没展示出排名,揉到子查询里取筛数据

SELECTt1.*
FROM
test t1
where (SELECT count(*) + 1 FROM test t2 WHERE t2.subject = t1.subject AND t2.score > t1.score ) <=3
ORDER BY t1.subject

方法二

group by 有会的,请留言

Mysql 分学科拿取前三名的数据相关推荐

  1. mysql 分组内取前几条数据

    项目中很常见的一个需求就是取出每个种类的前n条数据,这是我们通常想到分组(group by),但是group by后伴随着数据的聚合 每个种类只保留了一条数据,这并不满足我们的需求取前n条数据,这时候 ...

  2. MySQL查询一个表的前25%的数据

    MySQL查询一个表的前25%的数据,SQL如下: # qianfeng SELECT g.* FROM (SELECT @rownum:=0) r join tb_shopping_car g wh ...

  3. mysql查询每个id的前10条数据_解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据...

    我们都知道,各种主流的社交应用或者阅读应用,基本都有列表类视图,并且都有滑到底部加载更多这一功能, 对应后端就是分页拉取数据. 好处不言而喻,一般来说,这些数据项都是按时间倒序排列的,用户只关心最新的 ...

  4. oracle和sql server中,取前10条数据语法的区别

    在sql server中,取数据中前10条语句,我们可以用top 10 这样语句,但是oracle就没有这个函数,接下来介绍它们之间的区别 1.sql server 取前10语句和随机10条的语法 - ...

  5. js 数组对象只取前4条数据的值

    一个长度是5的数组,只取前三个数组对象 arr = arr.slice(0,4) 注意这个方法不改变原数组,所以需要用=

  6. C# Datatable排序与取前几行数据

    在C#中要对Datatable排序,可使用DefaultView的Sort方法.先获取Datatable的DefaultView,然后设置 得到的Dataview的sort属性,最后用视图的ToTab ...

  7. php sql跳过前四条数据,mysql实现每组取前N条记录的sql,以及后续的组数据量限制...

    select a.msg_id, a.com_id, a.data, a.ctime from sns_user_03.user_request_86 a where 5 (select count( ...

  8. mysql实现每组取前N条记录的sql,以及后续的组数据量限制

    应用场景大概是这样的:比如有很多消息流,这些消息来自不通的app,聚合在一个页面上,查看的时候不能让一个app的消息霸屏,所以就会类似于折叠功能,同一个app的消息只显示最多5条,再多的话,就要点进去 ...

  9. linux sort排序及取前几条数据

    查看sort --help -n 根据字符串的数值进行比较 -k 根据某一个关键字的位置或者类型排序 -r 倒序排序 -t 字段分隔,后面跟分隔符 查看head --help -n 打印前几行记录,后 ...

最新文章

  1. Movavi PDF Editor 3中文版
  2. python画海绵宝宝_一步一步教你画章鱼哥怎么画好看?教你学画海绵宝宝的章鱼哥简笔画!...
  3. 最长递增子序列问题合集
  4. JS基础之undefined与null的区别
  5. 《5G新体制天线技术》
  6. Facebook 中国程序员之死
  7. ubuntu给pip换源,给conda换源
  8. Hvv近期0day总结二
  9. 如何使用IDEA格式化JSON数据
  10. mysql如何实现cas机制_CAS机制详解
  11. visual studio 2019 代码历史记录 本地版本控制 AnkhSvn Local History 教程
  12. Windows环境下搭建Redis集群
  13. 反向代理服务器nginx
  14. 读书笔记-《20世纪最伟大的心理学实验》读后感1
  15. Shell脚本语法小记
  16. dedecms{dede:sql}{dede:php}标签的用法
  17. 棋盘(Checkerboard)算法
  18. 【047】Testyourvocab-五分钟测试你的英语词汇量
  19. 计算机网络IP地址分配
  20. 计算机鼠标无法控制,鼠标控制不了电脑屏幕

热门文章

  1. python中的math模块pi_Python的武器库02:math模块
  2. WPF路线图白皮书: 2015及未来
  3. 等差数列java用等差公式写_等差数列求和公式及推导方法
  4. 卷积神经网络 (GoogLeNet 的灵感)
  5. H5之webcoekt播放JPEG图片流
  6. 《那些年啊,那些事——一个程序员的奋斗史》——12
  7. 六轴加速度传感器MPU6050官方DMP库到瑞萨RL78/G13的移植
  8. React实现车牌号输入
  9. Could not load file or assembly #39;Microsoft.VisualBasic, ----jexus使用报错
  10. 计算机图形学 学习笔记 OpenGL图形用户界面和交互输入