我正在为我的数据库类完成一些查询,而且我遇到了一个我似乎无法获得的查询。
它说:“对于ID为”20084“(或任何其他值)的学生,显示所学课程的学分总数。不显示学生表中的tot_creds值,您应该使用SQL聚合学生参加的课程。“
我在网上找了一些答案,但没有一个真正让我信服,基本上所有这些都给了我不同的结果。
我自己有这个:
select sum(credits)
from (course join section using(course_id)) join (takes join student using(ID))
using (course_id, sec_id, semester, year)
where student.ID = 20084;
我遇到的问题是学生重复了几门课程,并且查询也返回了重复课程的学分。我已经尝试将distinct
放在sum(credits)
前面,但答案是一样的。
有什么我想念的吗?
感谢。
答案 0 :(得分:0)
这应该返回你要找的东西。在子选择中,我使用了MAX(),即使重复项的值是相同的,因此它将从重复的行返回一个结果。此子选择将为每个课程实例返回一行,因此其总和不包括重复的课程。
SELECT
`section`.`course_id`,
`section`.`sec_id`,
`section`.`semester`,
`section`.`year`,
MAX(`course`.`credits`) AS `credits`
FROM `student`
JOIN `takes`
ON `takes`.`ID` = `student`.`ID`
JOIN `section`
USING (`course_id`,`sec_id`,`semester`,`year`)
JOIN `course`
ON `course`.`course_id` = `section`.`course_id`
WHERE `student`.`ID` = 20084
GROUP BY `section`.`course_id`
ORDER BY `takes`.course_id`,`takes`.`grade` DESC
要测试子查询,请尝试运行此查询。它应该返回所有课程的列表,每门课程只有一行:
{{1}}