以下是我的询问:
$query = "
SELECT DISTINCT gr.SessionId, t.TeacherUsername, t.TeacherForename,
t.TeacherSurname, cm.ModuleId, m.ModuleName,
cm.CourseId, c.CourseName, st.Year, st.StudentUsername,
st.StudentForename, st.StudentSurname, 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)."')
ORDER BY $orderfield ASC
";
您无需担心WHERE子句和ORDER BY子句。我的问题是,当它应该显示13行时,查询结果显示26行。
我知道原因,这是因为Course_Module表是Course表和Module表之间的交叉引用表,需要它才能将Course表和Module表链接在一起。
但课程表使用CourseId来加入另一个表,Course_Module表也是如此。因此,在JOINS部分中使用了CourseId两次,因此它再次重复行。所以应该有13行,但因为每行都是重复的,所以显示26行。
我尝试了GROUP BY cm.CourseId,但它最终显示了2行,这是两个不同的CourseId,这根本不是我想要的。
那么我的问题是,我可以使用Course_Module表来JOIN表,但在显示结果时会忽略它吗?
如果查询是这样的:
$query = "
SELECT DISTINCT gr.SessionId, t.TeacherUsername, t.TeacherForename,
t.TeacherSurname, cm.ModuleId, m.ModuleName,
cm.CourseId, c.CourseName, st.Year, st.StudentUsername,
st.StudentForename, st.StudentSurname, 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;
此查询显示13行,但这表示没有指向模块表的链接,因此不知道为每个成绩分析采用的模块名称。
以下是我现在得到的结果示例:
Student Session Module Course Grade
S1 AAA CHT2520 ICT A
S1 AAA CHT2520 ICT A
S2 AAA CHT2520 ICT B
S2 AAA CHT2520 ICT B
S3 AAB CHT2220 BIT D
S3 AAB CHT2220 BIT D
S4 AAC CHI2250 COMP A
S4 AAC CHI2250 COMP A
应该是:
以下是我现在得到的结果:
Student Session Module Course Grade
S1 AAA CHT2520 ICT A
S2 AAA CHT2520 ICT B
S3 AAB CHT2220 BIT D
S4 AAC CHI2250 COMP A
谢谢
答案 0 :(得分:1)
您的select子句要求14列。您显示的结果只有5.如果您将select子句限制为这5列,您将获得所需的13行。
要包含所有14列,请查看结果中的其他列。现在意识到,结果集中没有26行,就像你有13行对行一样。仔细查看每一对,在某个地方你会发现一个不同的列 - 这是区分匹配对中的一个记录与另一个记录的区别。在承载此列的表的联接中添加条件,以防止其中一个值成为您的结果,并且您将获得正确的行数。这可能需要在连接条件中使用derived table或correlated sub-query来将连接限制为仅第一个匹配(对于由子查询确定的“first”的某些定义)。
答案 1 :(得分:-1)
我不是一个大专家,但为什么你在你的情况下使用两个不同的连接?在整个查询过程中坚持INNER JOIN,它可能会解决问题。