以下是我的问题:
$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。