首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询输出的行数超出了它的预期范围

问查询输出的行数超出了它的预期范围
EN

Stack Overflow用户
提问于 2011-10-30 20:56:09
回答 2查看 93关注 0票数 1

下面是我的问题:

代码语言:javascript
复制
$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正在输出的内容:

代码语言:javascript
复制
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’)。

下面是它应该输出的内容:

代码语言:javascript
复制
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’并且模块号只与正确的模块名匹配的行呢?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-30 21:38:13

问题是您从会话表中获取ModuleNumber,从模块表中获取ModuleName。您的查询是这样的:“对于本课程,获取所有成绩报告;对于这些成绩报告,获取所有学生;对于所有学生,获取所有课程;对于所有课程,获取所有课程模块链接;对于所有课程模块链接,获取所有模块。”

这就是为什么您会看到列出成绩报告、学生、课程和模块组合所有模块的原因。你可以添加"AND s.ModuleId = m.ModuleId“,这样就可以解决这个问题了。如果您也有ModuleNumber,我假定您的会话表中有ModuleId。如果是这样的话,您的会话表中就不需要ModuleNumber。

票数 1
EN

Stack Overflow用户

发布于 2011-10-30 21:42:57

您需要使用ModuleID作为WHERE语句的一部分。我对MySQL不太熟悉,所以为了避免搞砸,我将使用伪SQL:

代码语言:javascript
复制
WHERE 
    ((gr.SessionID = '' OR gr.SessionID = $SessionID)
AND
    (cm.ModuleID = $ModuleID))

请注意,OR条件需要是更大的AND规范的一个组件。

换句话说,您需要在您的标准中区分这两个模块。

当然,这假设名为"Web Program“的模块是唯一的,并且具有与名为”数据库“的模块不同的ModuleID。然而,它们在您的结果集中共享一个“模块编号”这一事实让我感到担忧。如果它们在您的模块表中没有唯一和不同的ID,您将需要在"ModuleName“字段上连接,或者(也许更重要的是)确保模块在您的数据模型中是唯一定义的。

如果表中的一条记录表示两个具有不同名称且代表不同条件选择的模块,则存在一个基本的设计问题。

无论如何,下面是我将您的MySQL查询组合在一起的尝试。再说一次,我可能把语法搞得一团糟。看起来里面有很多额外的标点符号。。。;-)

代码语言:javascript
复制
$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)."') 
      "; 

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7945017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档