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,目前我也不会,如果会,请留言,谢谢~~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值