[英]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.