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

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

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 基础(一)stat函数

    Header file: #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> DEFI ...

  2. 51nod 天气晴朗的魔法 - (Kruskall最小生成树)

    题目: 基准时间限制:1 秒 空间限制:131072 KB  51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动.   N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的魔力连接 ...

  3. 常用MouseEvent鼠标事件对象&KeyboardEvent键盘事件对象&常用键盘码

    MouseEvent鼠标事件对象: e.target //=> 事件源(操作的是哪个元素) e.clientX e.clientY //当前鼠标触发点距离当前窗口左上角的X|Y轴坐标 e.pag ...

  4. 2019-8-31-dotnet-core-隐藏控制台

    title author date CreateTime categories dotnet core 隐藏控制台 lindexi 2019-08-31 16:55:58 +0800 2019-2-1 ...

  5. dotnet 通过 WMI 获取系统补丁

    本文告诉大家如何通过 WMI 获取补丁 通过 Win32_QuickFixEngineering 可以获取系统启动的服务 下面代码只是获取补丁的 kb 字符 const string query = ...

  6. 解决IDEA使用terminal时 git log 乱码

    1.配置环境变量:  变量名称-LESSCHARSET 变量值:utf-8 2.重启IDEA

  7. Build 2017(简体中文视频)

    视频汇总地址 入口 可筛选某天的视频 部分包含中文字幕 我看过的视频 Day1 #MSBuild Day 1 Keynote(中文字幕) Three Runtimes, one standard… . ...

  8. OpenVINO 入门

    关于OpenVINO 入门,今天给大家分享一个好东西和好消息! 现如今,说人工智能(AI)正在重塑我们的各行各业绝不虚假,深度学习神经网络的研究可谓如火如荼, 但这一流程却相当复杂,但对于初学者来说也 ...

  9. .NET设计篇08-线程取消模型和跨线程访问UI

    知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂,输出倒逼输入 内容目录 一.线程统一取消模型1.取消令牌2.可以中断的线程1.设计一个中断函数2.创建CancellationTokenSour ...

  10. 「UVA12004」 Bubble Sort 解题报告

    UVA12004 Bubble Sort Check the following code which counts the number of swaps of bubble sort. int f ...