我正在为我的数据库类完成一些查询,我遇到了一个我似乎无法得到的查询。
它说:“对于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)前面,但答案是一样的。我遗漏了什么吗?谢谢。

发布于 2018-03-29 15:55:15
这应该还你想要的东西。在子select中,我使用了MAX(),尽管重复项的值是相同的,因此它将返回重复行的一个结果。此子选择将为课程的每个实例返回一行,因此它的和将不包括重复的课程。
SELECT
SUM(`a`.`credits`) as `credits`
FROM (
SELECT
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`.`grade` DESC
) AS `a`若要测试子查询,请尝试运行此查询。它应该返回所有课程的列表,每个课程只有一行:
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` DESChttps://stackoverflow.com/questions/49560029
复制相似问题