下面是我的问题:
$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)."')
";以下是query正在输出的内容:
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如果你仔细看看发生了什么,在我用来连接课程表和模块表的Course_Module表中,有两个模块用于课程'INFO102‘。因此,当它试图为每个学生显示一个会话的两个模块名称(来自模块表)时,它将显示4行。这是不正确的,因为它应该只链接到属于会话的模块,该模块应该是'Web Program',而不是'Database‘(这是因为模块表中的ModuleNumber CHT2520 = 'Web Program’)。
下面是它应该输出的内容:
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那么,我如何才能去掉'ModuleName‘下写着'Database’并且模块号只与正确的模块名匹配的行呢?
谢谢
发布于 2011-10-30 21:38:13
问题是您从会话表中获取ModuleNumber,从模块表中获取ModuleName。您的查询是这样的:“对于本课程,获取所有成绩报告;对于这些成绩报告,获取所有学生;对于所有学生,获取所有课程;对于所有课程,获取所有课程模块链接;对于所有课程模块链接,获取所有模块。”
这就是为什么您会看到列出成绩报告、学生、课程和模块组合所有模块的原因。你可以添加"AND s.ModuleId = m.ModuleId“,这样就可以解决这个问题了。如果您也有ModuleNumber,我假定您的会话表中有ModuleId。如果是这样的话,您的会话表中就不需要ModuleNumber。
发布于 2011-10-30 21:42:57
您需要使用ModuleID作为WHERE语句的一部分。我对MySQL不太熟悉,所以为了避免搞砸,我将使用伪SQL:
WHERE
((gr.SessionID = '' OR gr.SessionID = $SessionID)
AND
(cm.ModuleID = $ModuleID))请注意,OR条件需要是更大的AND规范的一个组件。
换句话说,您需要在您的标准中区分这两个模块。
当然,这假设名为"Web Program“的模块是唯一的,并且具有与名为”数据库“的模块不同的ModuleID。然而,它们在您的结果集中共享一个“模块编号”这一事实让我感到担忧。如果它们在您的模块表中没有唯一和不同的ID,您将需要在"ModuleName“字段上连接,或者(也许更重要的是)确保模块在您的数据模型中是唯一定义的。
如果表中的一条记录表示两个具有不同名称且代表不同条件选择的模块,则存在一个基本的设计问题。
无论如何,下面是我将您的MySQL查询组合在一起的尝试。再说一次,我可能把语法搞得一团糟。看起来里面有很多额外的标点符号。。。;-)
$query = "
SELECT *
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))."'
AND cm.ModuleID = '".mysql_real_escape_string($moduleid)."')
"; 希望这能有所帮助。
https://stackoverflow.com/questions/7945017
复制相似问题