以下是我的问题:

$query = "
          SELECT gr.SessionId, t.TeacherUsername, s.ModuleId, m.ModuleName,
      st.CourseId, st.Year, st.StudentUsername, gr.Mark, gr.Grade
      FROM Teacher t
          INNER JOIN Session s ON t.TeacherId = s.TeacherId
          JOIN Grade_Report gr ON s.SessionId = gr.SessionId
          JOIN Student st ON gr.StudentId = st.StudentId
          JOIN Course c ON st.CourseId = c.CourseId
          JOIN Course_Module cm ON c.CourseId = cm.CourseId
          JOIN Module m ON cm.ModuleId = m.ModuleId
          WHERE
            ('".mysql_real_escape_string($sessionid)."' = '' OR gr.SessionId = '".mysql_real_escape_string($sessionid)."')
          ";

以下是查询输出的内容:
Session ID  TeacherUsername Module Number   ModuleName  Course ID   Year    Student Username    Mark    Grade
AAA            m.prigmore   CHT2520        Web Program  INFO102      1      u1231231            69       B
AAA            m.prigmore   CHT2520        Database     INFO102      1      u1231231            69       B
AAA            m.prigmore   CHT2520        Web Program  INFO102      2      u0833421            71       A
AAA            m.prigmore   CHT2520        Database     INFO102      2      u0833421            71       A

如果你仔细看一下发生了什么,在我用来连接课程表和模块表的课程模块表中,有两个模块用于“INFO102”课程。因此,它显示4行,因为它试图为每个学生显示一个会话的两个模块名(来自模块表)。这是不正确的,因为它只应链接到属于会话的模块,该会话应为“Web程序”,而不是“数据库”(这是因为模块表中的ModuleNumber CHT2520=“Web程序”)。
下面是它应该输出的内容:
Session ID  TeacherUsername Module Number   ModuleName  Course ID   Year    Student Username    Mark    Grade
    AAA            m.prigmore   CHT2520        Web Program  INFO102      1      u1231231            69       B
    AAA            m.prigmore   CHT2520        Web Program  INFO102      2      u0833421            71       A

所以,我怎样才能去掉“Module Name”下面写着“Database”的行,并且模块号只与正确的模块名匹配?
谢谢您

最佳答案

问题是,您正在从会话表获取ModuleNumber,而从模块表获取ModuleName。您的查询显示:“对于本课程,获取所有成绩报告;对于那些成绩报告,获取所有学生;对于所有学生,获取所有课程;对于所有课程,获取所有课程模块链接;对于所有课程模块链接,获取所有模块。”
这就是为什么你会看到为成绩报告、学生、课程和模块的组合列出的所有模块。您可以添加“AND s.ModuleId=m.ModuleId”,这应该可以修复它。我假设您在会话表中有ModuleId,如果您也有ModuleNumber的话。如果是这样,则会话表中不需要ModuleNumber。

07-26 04:17