【发布时间】:2020-12-05 15:31:26
【问题描述】:
我的解决方案通过了第一个测试用例,但在最终提交后得到了错误的答案。我感谢任何愿意指出我的错误的人。谢谢!
问题如下:
表:学生
+---------------------+---------+
| Column Name | Type |
+---------------------+---------+
| student_id | int |
| student_name | varchar |
+---------------------+---------+
student_id 是该表的主键。 student_name 是学生的姓名。
表格:考试
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| exam_id | int |
| student_id | int |
| score | int |
+---------------+---------+
(exam_id, student_id) 是该表的主键。 拥有 student_id 的学生在 id 为exam_id 的考试中获得分数。
“相当”的学生是指至少参加过一次考试并且既没有获得高分也没有获得低分的学生。
编写 SQL 查询以报告学生(student_id、student_name)在所有考试中“安静”。
不要让从未参加过任何考试的学生退学。返回按 student_id 排序的结果表。
查询结果格式如下例。
学生桌:
+-------------+---------------+
| student_id | student_name |
+-------------+---------------+
| 1 | Daniel |
| 2 | Jade |
| 3 | Stella |
| 4 | Jonathan |
| 5 | Will |
+-------------+---------------+
考试表:
+------------+--------------+-----------+
| exam_id | student_id | score |
+------------+--------------+-----------+
| 10 | 1 | 70 |
| 10 | 2 | 80 |
| 10 | 3 | 90 |
| 20 | 1 | 80 |
| 30 | 1 | 70 |
| 30 | 3 | 80 |
| 30 | 4 | 90 |
| 40 | 1 | 60 |
| 40 | 2 | 70 |
| 40 | 4 | 80 |
+------------+--------------+-----------+
结果表:
+-------------+---------------+
| student_id | student_name |
+-------------+---------------+
| 2 | Jade |
+-------------+---------------+
问题中的解释:
对于考试 1:学生 1 和 3 分别获得最低和最高分。 对于考试 2:学生 1 持有最高分和最低分。 对于考试 3 和 4:Studnet 1 和 4 分别获得最低和最高分。 学生 2 和 5 从未在任何考试中获得最高或最低的分数。 由于学生 5 没有参加任何考试,因此他被排除在结果之外。 所以,我们只返回学生 2 的信息。
我的答案是创建两张表,一张是列出符合条件的学生,至少有一次考试。 另一种是找到考试表的最大值(分数)和最小值(分数)。 并使用 定位安静学生的 id,然后加入 Student 表查找 这个 student_id 的名字,如下:
-- get eligible student
with eligible_student as
(
select distinct student_id as eligible_id from Exam
group by 1
order by 1
),
-- get the high and low score
high_low as
(select student_id, max(score) as high_score, min(score) as low_score
from Exam),
result as
(select eligible_student.eligible_id as student_id
from eligible_student inner join
high_low
on eligible_student.eligible_id <> high_low.student_id
-- left join Student
-- on eligible_student.eligible_id = Student.student_id
group by student_id
order by student_id
)
select result.student_id, s.student_name as student_name
from result left join Student s
on result.student_id = s.student_id
order by student_id;
【问题讨论】:
标签: mysql sql inner-join having-clause