【发布时间】:2013-12-07 00:29:49
【问题描述】:
我有一个包含 3 列的表,student_id、section_id 和 marks,每列都包含整数值,student_id 是具有唯一值的主字段。现在我需要为以下 3 个场景编写查询(PS:这仅用于学习目的,所以如果可能的话,如果您能告诉我一些替代的逻辑方法,那就太好了):
- 找出每个部分排名第三的学生。
- 找出每个部分排名第 2、3、4 的学生。
- 找到每个部分中排名第 4 的学生(如果有的话),如果一个部分中有多个分数相同的学生,则跳过下一个排名。假设有 3 名学生获得相同的分数,他们将在一个部分中排名第二,然后跳过第三和第四名,下一个分数低于他们的学生将排名第五。
对于我尝试的第一个:
SELECT * FROM `students` s
WHERE s.student_id=
(
SELECT student_id
FROM students
WHERE s.section_id=section_id
ORDER BY marks DESC
LIMIT 2,1
)
GROUP BY section_id
ORDER BY marks DESC
虽然我不确定优化是否可行。
对于我尝试使用IN 的下一个,否则我无法在子查询中获取多于一行,但它说mysql 在IN 子句中不支持LIMIT,有没有为第二种情况修改此查询的方法?
最后,我不知道如何处理第三个。
我在http://sqlfiddle.com/#!2/6442fb/1创建了一个测试表
任何帮助表示赞赏。
【问题讨论】:
-
这行得通,但它是一个“未记录”的解决方案(除非您计算处理这些内容的手册页面上的用户 cmets 部分)。