簡體   English   中英

查詢輸出多於應做的行,這是為什么?

[英]Query outputting more rows than it should do, why is this?

我有一個表單,提交后將輸出輸入到表單中的數據並輸出到查詢結果中。 如果文本框為空,它將在所有數據中搜索該特定字段。 目前,我的查詢正在輸出以下內容:

SessionId     ModuleId     CourseId   ClassId    StudentUsername  TeacherUsername   Grade
ABB           CHT2520      INFO101    104        u0867587         m.prigmore        A
ABB           CHI2550      INFO101    101        u0867587         j.lu              A
ABB           CHI2550      INFO101    104        u1231231         j.lu              F
ABB           CHT2520      INFO101    101        u1231231         m.prigmore        F
NVK           CHI2550      INFO101    101        u0867587         j.lu              F
RMI           CHI2565      INFO101    102        u0660663         j.forden          F

它會輸出更多行,而應該這樣做。 一名學生在一門課上屬於一個模塊。 問題是,這表明一個學生在一個模塊的兩個班級中不正確。 之所以這樣做,是因為它根據學生所修讀的模塊來識別學生所在的班級。

因此,如果模塊“ CHI2550”有兩個班級,則將采用模塊“ CHI2550”的任何學生都分配給兩個班級,而應該將一個學生分配給一個模塊的一個班級,則應由“ StudentClass”表確定。 問題是,如果我在其中一個JOINS中包含“ StudentClass”,則查詢輸出9行。

查詢應輸出以下內容:

  SessionId     ModuleId     CourseId   ClassId    StudentUsername  TeacherUsername   Grade
    ABB           CHI2550      INFO101    101        u0867587         j.lu              A
    ABB           CHI2550      INFO101    104        u1231231         j.lu              F
    NVK           CHT2520      INFO101    103        u0867587         m.prigmore        F
    RMI           CHI2565      INFO101    102        u0660663         j.forden          F

如何獲取查詢以輸出上述結果? 下面是查詢:

 SELECT * FROM Course c
            INNER JOIN CourseModule cm ON c.CourseId = cm.CourseId
            JOIN Module m ON cm.ModuleId = m.ModuleId
            JOIN Class cl ON m.ModuleId = cl.ModuleId 
            JOIN Teacher t ON cl.TeacherId = t.TeacherId 
            JOIN Session s ON m.ModuleId = s.ModuleId
            JOIN Grade_Report gr ON s.SessionId = gr.SessionId
            JOIN Student st ON gr.StudentId = st.StudentId
          WHERE
            ('".mysql_real_escape_string($sessionid)."' = '' OR gr.SessionId = '".mysql_real_escape_string($sessionid)."')
          AND
            ('".mysql_real_escape_string($moduleid)."' = '' OR s.ModuleId = '".mysql_real_escape_string($moduleid)."')
          AND
            ('".mysql_real_escape_string($courseid)."' = '' OR c.CourseId = '".mysql_real_escape_string($courseid)."')
          AND
            ('".mysql_real_escape_string($classid)."' = '' OR cl.ClassId = '".mysql_real_escape_string($classid)."')
          AND
            ('".mysql_real_escape_string($teacherid)."' = '' OR t.TeacherUsername = '".mysql_real_escape_string($teacherid)."')
          AND
            ('".mysql_real_escape_string($studentid)."' = '' OR st.StudentUsername = '".mysql_real_escape_string($studentid)."')
          AND
            ('".mysql_real_escape_string($year)."' = '' OR st.Year = '".mysql_real_escape_string($year)."')
          AND
            ('".mysql_real_escape_string($grade)."' = '' OR gr.Grade = '".mysql_real_escape_string($grade)."')

以下是每個表格及其數據(對於我所面臨的問題,最重要的表格是StudentClass,Class,Student,Module):

Course Table:

CourseId            CourseName                                          Duration 
INFO101         Bsc Information Communication Technology (ICT)          3/4

CourseModule Table:

CourseId      ModuleId
INFO101       CHI2550
INFO101       CHI2565
INFO101       CHT2520

Module Table:

ModuleId            ModuleName                                 Credits
CHT2520          Advanced Web Programming                       20
CHI2565          E-Commerce Business and Technology             20
CHI2550          Modern Database Applications                   20

Session Table:

SessionId   ModuleId   Semester   SessionDate   SessionTime   TeacherId  Room     Building

NVQ        CHT2520      Spring    2011-03-21    13:00:00      T2       CW2/04   Canalside West
NVK        CHT2520      Fall      2011-11-10    10:00:00      T2       CW2/04   Canalside West
RMI        CHI2565      Fall      2011-09-13    12:00:00      T5       CW5/01   Canalside West
RMT        CHI2565      Spring    2011-03-29    14:00:00      T2       CW2/04   Canalside West
ABB        CHI2550      Spring    2011-03-15    12:00:00      T1       CW4/10   Canalside West
ABH        CHI2550      Summer    2011-05-03    15:00:00      T4       CW4/10   Canalside West

Grade_Report Table:

StudentId  SessionId  Grade  Mark 
S1          NVK         F      5
S2          ABB         A      80
S1          ABB         A      80
S3          RMI         F      0

 Student Table:

StudentId  StudentForename     StudentSurname    Year   StudentUsername    CourseId 
S1         Mayur                 Patel            3       u0867587          INFO101
S2         Jim                   Carlton          3       u1231231          INFO101
S3         Ahmed                 Seedat           3       u0660663          INFO101
S4         Amar                  Barot            3       u0954857          INFO101
S5         Richard               Davies           3       u0877223          INFO101

StudentClass Table:

ClassId  StudentId
101        S1
102        S3
103        S1
104        S2


    Class Table:

ClassId    Room      ClassDay      ClassTime      ModuleId      CourseId      TeacherId 
101        CW4/10    Thursday       10:00:00      CHI2550       INFO101         T1
102        CW5/01    Wednesday      12:00:00      CHI2565       INFO101         T5
103        CW2/04    Monday         15:00:00      CHT2520       INFO101         T2
104        CW4/10    Thursday       11:00:00      CHI2550       INFO101         T1


Teacher Table:

TeacherId  TeacherForename  TeacherSurname  TeacherUsername  TeacherPassword 
T1          Joan            Lu              j.lu             scomp21
T2          Martyn          Prigmore        m.prigmore       prigmore36
T3          Arshard         Ali             a.ali            aliict
T4          Paul            Judge           p.judge          data01
T5          John            Forden          j.forden         hudds_10

我將從將查詢更改為單個表查詢開始,並確保從中獲得所需的信息,然后一次添加一個表,直到開始出現重復的行。

我最好的猜測是,您有一對表,需要在兩個字段上進行連接,而不是一個,並且單個字段連接匹配已連接表中的多行,從而在輸出中產生多余的行。

另一種可能性是您的一張表中有重復的行信息,這導致重復的結果。

在兩種情況下,您的CourseModule表都可能是問題所在...

由於有很多表和許多聯接,因此很難從您的問題中看到確切的解決方案,這是眾所周知的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM