Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中处理来自两个子查询的结果_Mysql_Subquery_Correlated Subquery - Fatal编程技术网

在MySQL中处理来自两个子查询的结果

在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

对于家庭作业,我必须编写一个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 * ( 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语法(我们还没到那个地步。)再次感谢!