前几天,某在培训的朋友问我一个问题:查询每门功课成绩最好的前两名该怎么写。

这个问题虽然听起来挺简单,但是很有意思,于是我就新建了一张如下的表:

stuNo为学号,stuScore为分数,courseId为课程id。

然后我的思路是把每科分数最高的两个学生筛选出来,然后再进行处理,但是MySQL子查询不能包含LIMIT字段,而且这样写有点蠢,所以查了查资料找出了一种比较好的写法,如下:

 select a1.* from score a1
INNER JOIN
(select a.courseId,a.stuScore from score a left join score b
on a.courseId=b.courseId
and a.stuScore<=b.stuScore
group by a.courseId,a.stuScore
having count(b.stuScore)<=2
)b1
on a1.courseId=b1.courseId and a1.stuScore=b1.stuScore
order by a1.courseId,a1.stuScore desc;

虽然这样写有点繁琐,但是这种写法是对的,我自己也没找到更好的写法,就把答案给了朋友。

然后,第二天,朋友说他们老师的答案是:

 Select * from score a
where (Select count(*) from score b
where a.courseId=b.courseId
and a.stuScore<=b.stuScore
)<=2
order by courseId,stuScore desc;

当时看到答案,我心里:卧槽!!!这是什么写法,为什么where条件判断了一下select count(*)是否小于等于2就能做到筛选各科数据前几名 ???

然后,我自己网上找了一下select count(*)写法相关的资料,没找到任何答案。。。

然后,我问我们领队,他找了半天,也没找到任何答案。。。

然后,我们领队问我们项目经理,也没答案。。。

然后,就没然后了。。。

目前我还在等朋友老师的答案,所以暂时写到这儿吧。。。虽然不太理解这种写法,但是这种写法无疑做到了筛选的功能,而且异常简洁,所以在这里记录一下这种写法。如果大家有理解这种写法的请赐教,在评论区留言,解除菜鸟的疑惑。

获取各类前几名数据的MYSQL写法的更多相关文章

  1. 获取DataTable前几条数据

    #region 获取DataTable前几条数据 /// <summary> /// 获取DataTable前几条数据 /// </summary> /// <param ...

  2. VUE:v-for获取列表前n个数据、中间范围数据、末尾n条数据的方法

    说明: 1.开发使用的UI是mintUI, 要求: 1.获取6到13之间的数据:items.slice(6,13) <mt-cell v-for="(item,index) in it ...

  3. DataTable相关操作,筛选,取前N条数据,去重复行,获取指定列数据

    #region DataTable筛选,排序返回符合条件行组成的新DataTable或直接用DefaultView按条件返回      /// <summary>      /// Dat ...

  4. DataTable相关操作,筛选,取前N条数据,获取指定列数据

    DataTable相关操作,筛选,取前N条数据,获取指定列数据2013-03-12 14:50 by Miracle520, 2667 阅读, 0 评论, 收藏, 编辑 1 #region DataT ...

  5. 【转】C# Datatable排序与取前几行数据

    转自:http://www.cnblogs.com/linyechengwei/archive/2010/06/14/1758337.html http://blog.csdn.net/smartsm ...

  6. mysql GROUP_CONCAT+ GROUP BY + substring_index获取分组的前几名

    mysql方法来源于:http://www.cnblogs.com/jjcc/p/5896588.html ###在网上看到一篇,非常赞的方法### 比如说要获取班级的前3名,mysql就可以用GRO ...

  7. mysql GROUP_CONCAT获取分组的前几名

    比如说要获取班级的前3名,oracle 可以用 over partition by 来做.mysql就可以用GROUP_CONCAT  + GROUP BY + substring_index实现. ...

  8. MySQL 排名、分组后组内排名、取各组的前几名 及排名后更新插入数据表中

    一.排名 /*普通排名:从1开始,顺序往下排*/ AS rank ) r ORDER BY score; /*并列排名:相同的值是相同的排名*/ SELECT cs.* , CASE WHEN @p= ...

  9. 数据可视化之powerBI技巧(十二)学会这几个度量值,轻松获取前N名

    数据中的明细项一般都有很多,可是我们关注的往往只是前几名,所以在报表中只展示关注的部分,就十分常用. 有了上篇(这几个示例,帮你深入理解RANKX排名)关于排名的铺垫,仅显示前N名就简单多了. 依然以 ...

随机推荐

  1. linux 让出处理器

    如我们已见到的, 忙等待强加了一个重负载给系统总体; 我们乐意找出一个更好的技术. 想到的第一个改变是明确地释放 CPU 当我们对其不感兴趣时. 这是通过调用调度函数而 实现地, 在 <linu ...

  2. Jasypt加密SpringBoot配置文件

    如果 SpringBoot 的 properties 文件中含有用户名密码等敏感信息,为了安全起见需要对明文密码加密.Jasypt 是用来加密的 jar 包. 1.引入 Jasypt 在 pom.xm ...

  3. 【b503】篝火晚会

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官" ...

  4. 相似文本文档分析之SimHash算法

    Simhash算法: Simhash算法由Google的Charikar提出,是将一篇文档转化为n位的签名,通过比较签名的相似度来计算原文档的相似度.签名越相近,则文档越相近.因此,整个过程就不会涉及 ...

  5. Destoon系统目录树SEO属性目录开发实例

    如何在destoon里设置树形目录结构的SEO优化方式官方给的SEO伪静态实例是没有这个方式的 楼主后来想了一下,就干脆自己做一个吧,已经测试完全无误通过,特意分享给大家 目前比如sell模块下类别[ ...

  6. 从头学pytorch(六):权重衰减

    深度学习中常常会存在过拟合现象,比如当训练数据过少时,训练得到的模型很可能在训练集上表现非常好,但是在测试集上表现不好. 应对过拟合,可以通过数据增强,增大训练集数量.我们这里先不介绍数据增强,先从模 ...

  7. beta 1/2 阶段中间产物提交入口

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9918 git地址:https://e.coding.net/Eustia ...

  8. 网络状态诊断工具——netstat命令

    netstat命令可以用来查询整个系统的网络状态.百度百科的定义如下: Netstat的定义是: Netstat是在内核中访问网络连接状态及其相关信息的程序,它能提供TCP连接,TCP和UDP监听,进 ...

  9. CSP201803-4棋局评估

    问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是“X”,Bob放的是“O”,Alice执先.当同一种棋子占据一行.一列或一条对角 ...

  10. 使用Django进行后端开发

    目录 更换pip源 搭建虚拟环境 项目目录设置 项目相关配置 更换pip源 更换pip源 搭建虚拟环境 搭建虚拟开发环境 项目目录设置 项目目录设置 项目相关配置 项目相关配置