查询中的JOINS最终会显示太多行

时间:2011-10-30 02:07:18

标签: mysql sql database

以下是我的询问:

 $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

谢谢

2 个答案:

答案 0 :(得分:1)

您的select子句要求14列。您显示的结果只有5.如果您将select子句限制为这5列,您将获得所需的13行。

要包含所有14列,请查看结果中的其他列。现在意识到,结果集中没有26行,就像你有13行行一样。仔细查看每一对,在某个地方你会发现一个不同的列 - 这是区分匹配对中的一个记录与另一个记录的区别。在承载此列的表的联接中添加条件,以防止其中一个值成为您的结果,并且您将获得正确的行数。这可能需要在连接条件中使用derived tablecorrelated sub-query来将连接限制为仅第一个匹配(对于由子查询确定的“first”的某些定义)。

答案 1 :(得分:-1)

我不是一个大专家,但为什么你在你的情况下使用两个不同的连接?在整个查询过程中坚持INNER JOIN,它可能会解决问题。