mysql 分组查询前n条数据
今天去面试,碰到一道面试题:
有一个学生成绩表,表中有 表id、学生名、学科、分数、学生id 。查询每科学习最好的两名学生的信息:
建表sql:
CREATE TABLE `stuscore` (
`name` varchar(225) DEFAULT NULL,
`subject` varchar(225) DEFAULT NULL,
`score` int(10) DEFAULT NULL,
`stuid` int(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
插入数据:
INSERT INTO `stuscore`(`id`,`name`,`subject`,`score`,`stuid`)
VALUES
(1,'张三','数学',20,1),
(2,'张三','语文',35,1),
(3,'张三','英语',50,1),
(4,'李四','数学',80,2),
(5,'李四','语文',60,2),
(6,'李四','英语',26,2),
(7,'王五','数学',68,3),
(8,'王五','英语',88,3),
(9,'王五','语文',84,3);
表截图如下:
首先说一下需要查询的结果(每学科的前两名)如下:
*******************************************************************以上为需求,以下是思路和解决方案***********************************************************************
首先说一下思路,在这里思路里有沉淀的东西。
一(本方法比后面方法要好,简单清晰)
某学科的前两人都有两个个特征:①学科为对应学科②该学科下,分数比其高或者等于的要小于两人
根据这个思路sql如下:
SELECT a.id,a.name,a.subject,a.score,a.stuid FROM stuscore a WHERE 2 >
(SELECT COUNT(*) countb FROM stuscore b WHERE b.subject=a.subject AND b.`score`>a.`score` ) GROUP BY a.stuid,a.subject
*备注:上面这个sql经测试可以正确查询
本人有两个问题
①将“>”两边的表达式调换位置,发现什么也没能查出来,不知道为什么
②在where 后面的括号里面的count括号里面的* 改成b.*,发现报错,而改成b.id 则可以正常查出来,不知道为什么
二
使用表的自连接,
SELECT a.name,a.subject,a.score,a.stuid ,b.name,b.subject,b.score,b.stuid
FROM stuscore a
LEFT JOIN stuscore b ON a.subject=b.subject AND a.score<b.score
GROUP BY a.name,a.subject,a.score,a.stuid
HAVING COUNT(a.stuid)<2 ORDER BY a.subject,a.score DESC;
这个方法我看过来看过去觉得思路比较曲折,能力有限,不解释了
三(如果只是想解决问题,可以不看本套解决方案,因为本解决方案经测试报错,无法正确查出记录,但是sql比较精妙)
SELECT * FROM stuscore a WHERE a.id IN
(SELECT b.id FROM stuscore b WHERE b.subject=a.subject ORDER BY b.score DESC LIMIT 2) ORDER BY a.subject,a.score DESC;
本人在想利用存储过程将这个问题解决,待续写。。。。
本文参考:http://www.jb51.net/article/87307.htm
mysql 分组查询前n条数据的更多相关文章
- mysql分组查询前n条数据
建表: CREATE TABLE hard(id INT,aa varchar(50) ,bb INT,PRIMARY key(id))insert into hard values(1,'a',9) ...
- MySQL分组查询,前3条数据
SELECT tpn.news_id, tpn.title, tpn.news_group_id, tpn.send_date FROM t_pm_news tpn WHERE 3 > ( SE ...
- mysql怎么查询前10条数据?
mysql 没有top的用法.取而代之的是limit语法为:limit m,n省略n就可以得到你要的效果了. select * from table1 order by column desc li ...
- 不同数据库,查询前n条数据的SQL语句
不同的数据库,支持的SQL语法略有不同,以下是不同数据库查询前n条数据的SQl语句 SQL Server(MSSQL) SELECT TOP n * FROM table_name ORACLE SE ...
- MySQL分组查询获取每个学生前n条分数记录(分组查询前n条记录)
CREATE TABLE `t_test` ( `id` ) NOT NULL AUTO_INCREMENT, `stuid` ) NOT NULL, `score` ) DEFAULT NULL, ...
- mysql 数据库查询最后两条数据
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u011925175/article/details/24186917 有一个mysql数据库的 ...
- Oracle查询前几条数据的方法
在Oracle中实现select top N:由于Oracle不支持select top 语句,所以在Oracle中经常是用order by 跟rownum的组合来实现select top n的查询. ...
- mysql 查询前几条数据
limit是mysql的语法select * from table limit m,n其中m是指记录开始的index,从0开始,表示第一条记录n是指从第m+1条开始,取n条.select * from ...
- MYSQL查询前30条数据
, LIMIT 接受一个或两个数字参数. 参数必须是一个整数常量. 如果给定两个参数,第一个参数指定第一个返回记录行的偏移量, 第二个参数指定返回记录行的最大数目. 初始记录行的偏移量是 (而不是 )
随机推荐
- 【extjs6学习笔记】1.13 初始: 模型
Ext JS包括数据包Ext.data包括处理从服务器保存和检索数据的类. 以下是Ext JS 6数据包中的重要类: Model (Ext.data.Model) Store (Ext.data.St ...
- 1)实际时间(real time): 从command命令行开始执行到运行终止的消逝时间; 2)用户CPU时间(user CPU time): 命令执行完成花费的用户CPU时间,即命令在用户态中执行时间总和; 3)系统CPU时间(system CPU time): 命令执行完成花费的系统CPU时
1)实际时间(real time): 从command命令行开始执行到运行终止的消逝时间: 2)用户CPU时间(user CPU time): 命令执行完成花费的用户CPU时间,即命令在用户态中执行时 ...
- python内存泄露的诊断(转)
本篇文章非原创,转载自:http://rstevens.iteye.com/blog/828565 . 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是有了 ...
- OpenLayers学习笔记2——坐标转换问题
参照别人的添加marker的demo来改造时,发现无论怎样更改经纬度,都是停留在同一个位置.过了一两天突然想起可能是坐标参考的问题,尝试搜了一下,果然是这个问题.问题是这样子的: WMTS中地图的坐标 ...
- [OS] 可执行文件的装载
http://www.jianshu.com/p/e1300e7a4c48 1. 虚拟内存 在早期的计算机中,程序是直接运行在物理内存上的,程序在运行时访问的地址就是物理地址.可是,当计算机中同时运行 ...
- 2019年5~6月训练记录(更新ing)
前言 \(ZJOI\)正式结束了. 但期中考试只考了年级\(216\),退役既视感... 于是就被抓回去补文化课了. 下半个学期可能要以文化课为主了吧! 但周三.周日应该还是会正常参加训练的,但其他时 ...
- Spring学习记录(三)
一.AOP的整理总结 aop面向切面编程 横向重复代码,纵向抽取 动态代理 1.通过动态代理可以体现aop思想 2.为什么要哦用动态代理:对目标对象中的方法进行增强 spring aop开发 spri ...
- C#逻辑运算符
一.C#逻辑运算符 C#语言的逻辑运算符是对变量的值.表达式的运算结果进行比较,基比较结果为True或False. 二.示例 using System;using System.Collections ...
- React后台管理系统-商品列表搜索框listSearch组件
1.商品列表搜索框 2.搜索框页面的结构为 <div className="row search-wrap"> <div classN ...
- DOM4j-中文API
1.DOM4J简介 DOM4J是 dom4j.org 出品的一个开源 XML 解析包.DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP. ...