一个 mysql 表,只有学生姓名`name`和学生成绩`grade`两列,现在要 SELECT 出排名前十的同学,但如果满分的有 12 个,则 SELECT 的结果该有 12 个学生,该如何写 SQL 语句?

2020-09-12 09:40:30 +08:00
 Newyorkcity
谢谢
4783 次点击
所在节点    问与答
58 条回复
wangsongyan
2020-09-12 09:44:45 +08:00
分数 group 取前十,然后根据分数取学生
herozzm
2020-09-12 09:46:20 +08:00
单纯 sql 查询解决不了,sql 根据成绩 desc 排序出现所有结果,然后 for 遍历,使用一个 count 变量和 rank 数组变量,每次判断是否 in rank,no in 则 count 加 1,并 append 到 rank,一直到 count 等于 10
Firewine
2020-09-12 09:46:43 +08:00
排序 grade,取前 12 个不也是可以吗
oneisall8955
2020-09-12 09:52:10 +08:00
楼主意思是满分就取全部满分的,否则就取前 10 吧
Ptu2sha
2020-09-12 09:54:45 +08:00
套个子查询不香?
swulling
2020-09-12 09:55:05 +08:00
实际工程使用数据库,不要在数据库上花太多心思,普通查询解决不了的,读出来业务系统二次处理。
因为成绩相同是小概率事件,先按照成绩 sorted 读 15 个取前十名,如果不够再循环往后读就行了。
Newyorkcity
2020-09-12 09:55:34 +08:00
@oneisall8955
@Firewine
是的,另外如果满分 100 分 9 个,99 分 2 个,那返回的结果就该是 11 个。但如果满分 9 个,99 分 1 个,98 分 1 个,那返回结果就该是 10 个。。这样的
799635347
2020-09-12 09:55:45 +08:00
递归?
herozzm
2020-09-12 09:55:47 +08:00
@wangsongyan #1 @Firewine #3 @oneisall8955 #4 楼主的意思排前十名,多个分数一样的算成一个
Newyorkcity
2020-09-12 09:56:09 +08:00
@qingdanmo
@799635347
可以具体说说吗?
herozzm
2020-09-12 09:57:02 +08:00
@Newyorkcity #7 我上面的办法再加入判断逻辑就可以
qiayue
2020-09-12 09:57:27 +08:00
@Firewine 12 是举例,是一个不确定的数,假如有 20 个满分,则需要取出 20 个。
herozzm
2020-09-12 10:10:04 +08:00
业务逻辑有问题,如果 100 分有 9 个,99 的有 3 个,你怎么算
lithiumii
2020-09-12 10:10:38 +08:00
先找出前 10 的分数,再找人
gaobing
2020-09-12 10:12:39 +08:00
select name , grade
from s
where grade in
(select grade from s order by grade desc limit 0,10)
herozzm
2020-09-12 10:18:09 +08:00
```伪代码
students = "select * from table ORDER BY grade"

count = 0;
ranks = [];

for student in students {

if count == 10 {
break;
}

if student not in ranks {
ranks = append(ranks, student)
count++
}

}

print(ranks)
corningsun
2020-09-12 10:19:13 +08:00
herozzm
2020-09-12 10:21:30 +08:00
上面打错了部分代码,这个伪代码
```
students = "select * from table ORDER BY grade"

count = 0;
ranks = [];

for student in students {

if count == 10 {
break;
}

for rank in ranks {
if student.grade == rank.grade {
ranks = append(ranks, student)
continue;
}
}

ranks = append(ranks, student)
count++

}

print(ranks)
RJH
2020-09-12 10:25:03 +08:00
这个严格来说都不是 SQL 问题,而是业务上遇到 12 个满分的同学时,怎么处理的问题,找产品吧
herozzm
2020-09-12 10:27:19 +08:00
如果多个分数算一个的逻辑,大致写了一个
![伪代码.png]( https://i.loli.net/2020/09/12/MycC2hLYoXBrnVf.png)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/706317

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX