在MySQL中处理来自两个子查询的结果
对于家庭作业,我必须编写一个MySQL查询来计算数据库表中每个学生的GPA。我把问题分为三个部分:(1)计算每个学生获得的分数,(2)计算获得的学分数,然后(3)将分数除以学分。以下是我为步骤1和2编写的查询:在MySQL中处理来自两个子查询的结果,mysql,subquery,correlated-subquery,Mysql,Subquery,Correlated Subquery,对于家庭作业,我必须编写一个MySQL查询来计算数据库表中每个学生的GPA。我把问题分为三个部分:(1)计算每个学生获得的分数,(2)计算获得的学分数,然后(3)将分数除以学分。以下是我为步骤1和2编写的查询: 计算获得的分数: SELECT ID, SUM( credits ) AS credits_taken FROM takes NATURAL JOIN course GROUP BY ID 2查找获得的分数: SELECT ID, SUM( credits * ( SELE
SELECT ID, SUM( credits ) AS credits_taken
FROM takes
NATURAL JOIN course
GROUP BY ID
SELECT ID, SUM( credits * ( SELECT points FROM gradepoint WHERE letter = grade ) ) AS tot_grade_points
FROM takes NATURAL JOIN course
GROUP BY ID
我手动评估了每个查询,它们返回了正确的结果。但我不知道如何为每个学生返回(学分/总分)
。以下是我尝试过的:
SELECT ID, GPA
FROM student AS S NATURAL JOIN
(SELECT ID,( 'credits_taken' / SUM( credits * ( SELECT points FROM gradepoint WHERE letter = grade ) )) AS GPA
FROM takes AS T1 NATURAL JOIN course
WHERE S.ID = T1.ID
AND EXISTS (
SELECT ID, SUM( credits ) AS 'credits_taken'
FROM takes AS T2 NATURAL JOIN course
WHERE S.ID = T2.ID
GROUP BY ID
)
GROUP BY ID) Z
GROUP BY ID
但这给了我一个错误“where子句”中的未知列“S.ID”。据我所知,在联接操作中不能从子查询引用表的别名。是否有人有其他方法计算这两个子查询并将它们绑定到学生ID返回
“takes”表将学生id映射到他们所选课程的信息,最重要的是课程id和成绩。“课程”表包含“学分”字段,即课程的学分数
编辑
以下是相关的表格结构:
采取:
Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| ID | varchar(5) | NO | PRI | | |
| course_id | varchar(8) | NO | PRI | | |
| sec_id | varchar(8) | NO | PRI | | |
| semester | varchar(6) | NO | PRI | | |
| year | decimal(4,0) | NO | PRI | 0 | |
| grade | varchar(2) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
课程:
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| course_id | varchar(8) | NO | PRI | | |
| title | varchar(50) | YES | | NULL | |
| dept_name | varchar(20) | YES | MUL | NULL | |
| credits | decimal(2,0) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
我会尝试:
SELECT takes.sec_id,
SUM( course.credits * gradepoint.points ) / SUM( course.credits ) AS GPA
FROM takes
JOIN gradepoint ON takes.grade = gradepoint.letter
JOIN course ON takes.course_id = course.course_id
GROUP BY takes.sec_id
由于您的表结构描述不完整,我不得不猜测成绩点模式,并且我假设Secu id在takes
表中标识一名学生,如果有另一列,只需在SELECT
和GROUP BY
部分的查询中替换它即可。可能是ID,但像这样的列名通常用于主键。或者根本没有定义主键,这是一种糟糕的做法。此外,如果您需要除id以外的任何学生信息,如姓名等,则需要加入student
表
我还建议使用JOIN。。。在…
语法而不是自然连接上,它不仅更具可读性,还为您提供了更大的灵活性,例如查看gradepoint是如何连接的,而不是使用昂贵的依赖子查询。我会尝试:
SELECT takes.sec_id,
SUM( course.credits * gradepoint.points ) / SUM( course.credits ) AS GPA
FROM takes
JOIN gradepoint ON takes.grade = gradepoint.letter
JOIN course ON takes.course_id = course.course_id
GROUP BY takes.sec_id
由于您的表结构描述不完整,我不得不猜测成绩点模式,并且我假设Secu id在takes
表中标识一名学生,如果有另一列,只需在SELECT
和GROUP BY
部分的查询中替换它即可。可能是ID,但像这样的列名通常用于主键。或者根本没有定义主键,这是一种糟糕的做法。此外,如果您需要除id以外的任何学生信息,如姓名等,则需要加入student
表
我还建议使用JOIN。。。在…
语法而不是自然联接上
,不仅可读性更高,还为您提供了更大的灵活性,例如,查看gradepoint是如何联接的,而不是使用代价高昂的依赖子查询。要联接到的表课程的ID列是什么?是身份证吗?发布3个表的列结构会很有用。请将撇号从“credits_take”(一个字符串)删除到credits_take/SUM(…),然后重试。当我删除撇号时,“field list”(字段列表)中显示未知列“credits_take”。您希望加入Takes的表课程上的ID列是什么?是身份证吗?发布3个表的列结构会很有用。将“credits_take”(一个字符串)中的撇号删除为credits_take/SUM(…),然后重试。当我删除撇号时,“field list”中会显示未知列“credits_take”。非常感谢,这非常有效。我不知道JOIN-ON语法(我们还没到那个地步。)再次感谢!非常感谢,这非常有效。我不知道JOIN-ON语法(我们还没到那个地步。)再次感谢!