mysql-单张表中《查询各科成绩前两名的记录》

先上表结构及SQL语句:
建表脚本(不规范的以汉字建吧,顾名思义):
DROP TABLE IF EXISTS score;

CREATE TABLE score (
学号 varchar(100) NOT NULL,
课程号 varchar(100) NOT NULL,
成绩 varchar(100) DEFAULT NULL,
PRIMARY KEY (学号,课程号)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into score(学号,课程号,成绩) values (‘0001’,‘001’,‘30’),(‘0001’,‘002’,‘88’),(‘0001’,‘003’,‘45’),(‘0002’,‘001’,‘57’),(‘0002’,‘003’,‘33’),(‘0003’,‘002’,‘88’),(‘0003’,‘003’,‘45’),(‘0004’,‘001’,‘40’),(‘0004’,‘003’,‘78’),(‘0004’,‘004’,‘66’);

查询SQL:
1、SELECT s1.学号, s1.课程号, s1.成绩
FROM score s1
WHERE EXISTS (SELECT COUNT(1) FROM score s2 WHERE s2.课程号 = s1.课程号 AND s2.成绩 > s1.成绩
HAVING COUNT(1) < 2)
ORDER BY s1.课程号, s1.成绩 DESC;
2、SELECT s1.学号, s1.课程号, s1.成绩
FROM score s1
WHERE (SELECT COUNT(1) FROM score s2 WHERE s2.课程号 = s1.课程号 AND s2.成绩 > s1.成绩) < 2
ORDER BY s1.课程号, s1.成绩 DESC;
上面两个SQL其实是一样的,不同的写法而已。

主要问题来了:我搜索了百度很多类似SQL。其实也有写对的,但是评论没人回复,然而评论总是那么相似,好多人说数据重复了,就不对了,怎么出来大于2条或者3条、4条等等。其实问题就出在这,你品,你细品。《查询各科成绩前两名的记录》,人家让查前两名的成绩,比如:课程号-003,成绩由高至低倒序排名有一个90分,三个85分,那么最终记录应该是四条才对,因为三个85分并列第二名,那就他们就都属于前两名。
结果误区:并不是一个90,一个85.这其实属于前两条,而不是前两名。如果真的取一个90,一个85,那么三个85分你到底取张三的85、李四的85、还是王五的85成绩?好,你随机取一个,其他两个人要跟你干架了,问你:“凭什么不是他们”?生活中这种场景几乎没有,换句话说,这种场景不合理。
PS:你非要犟,你就说取前两条一个90,一个85。hh~ Sorry,目前我也不会,如果会,请留言,谢谢~~

你可能感兴趣的:(mysql-单张表中《查询各科成绩前两名的记录》)