mysql每学科前两名having_mysql分组查询前n条数据今天去⾯试,碰到⼀道⾯试题:mysql面试题sql
有⼀个学⽣成绩表,表中有 表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),
spliceport(9,'王五','语⽂',84,3);
表截图如下:
数据结构c语言教程⾸先说⼀下需要查询的结果(每学科的前两名)如下:
*******************************************************************以上为需求,以下是思路和解决⽅案
***********************************************************************
⾸先说⼀下思路,在这⾥思路⾥有沉淀的东西。
⼀(本⽅法⽐后⾯⽅法要好,简单清晰)
某学科的前两⼈都有两个个特征:①学科为对应学科②该学科下,分数⽐其⾼或者等于的要⼩于两⼈
根据这个思路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
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;marginright20px是什么意思
本⼈在想利⽤存储过程将这个问题解决,待续写。。。。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论