sql 查询 top 排名问题

MySQL中查询获取每个班级成绩前三名的学生信息

CREATE TABLE t_testscore(
pk_id INT PRIMARY KEY,
c_name VARCHAR(50) ,    
c_score INT,    
c_class INT) DEFAULT CHARSET=utf8;

INSERT INTO t_testscore VALUES (1, '张三6', 66, 1),(2, '张三5', 65, 1),(3, '张三4', 64, 1), (4, '张三3', 63, 1),(5, '张三2', 62, 1);
INSERT INTO t_testscore VALUES (11, '李四6', 76, 2),(12, '李四5', 75, 2),(13, '李四4', 74, 2), (14, '李四3', 73, 2),(15, '李四2', 72, 2);

SELECT * FROM t_testscore t  
WHERE EXISTS(
SELECT COUNT(*) FROM t_testscore ts
WHERE ts.c_score>=t.c_score
GROUP BY ts.c_class
HAVING COUNT(*)<=3
)  
ORDER BY c_class,c_score DESC;

group by 与 having count 学习:https://blog.csdn.net/qq_39443687/article/details/81025924

where exists 学习:https://www.cnblogs.com/beijingstruggle/p/5885137.html

 

如果 where exsits,having 不好理解的话,也可以下面这样写:

SELECT * 
FROM  `t_testscore` s1
WHERE (
SELECT COUNT( 1 ) 
FROM  `t_testscore` s2
WHERE s1.c_class = s2.c_class
AND s2.c_score >= s1.c_score
) <=3
ORDER BY s1.`c_class` , s1.`c_score` DESC 
LIMIT 0 , 30

第一个where 条件 后面的内容可以这样理解

s1:                                            s2:

班级        分数       count(1) : s2分数  >=  s1的分数的人数

1              66          1

1              65          2

1              64          3

1              63          4

...             ...           ....

2              76          1

2              75          2

...             ...           ...

 

再看上面sql 的括号里<=3 取的就是count(1)  <= 3 的记录了 。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值