Php 查询输出的行数超过了它应该输出的行数,这是为什么?
我有一个表单,当它被提交时,它将输出输入表单中的数据,并在查询结果中输出。如果文本框为空,它将搜索该特定字段的所有数据。此时,我的查询正在输出以下内容:Php 查询输出的行数超过了它应该输出的行数,这是为什么?,php,mysql,database,Php,Mysql,Database,我有一个表单,当它被提交时,它将输出输入表单中的数据,并在查询结果中输出。如果文本框为空,它将搜索该特定字段的所有数据。此时,我的查询正在输出以下内容: SessionId ModuleId CourseId ClassId StudentUsername TeacherUsername Grade ABB CHT2520 INFO101 104 u0867587 m.prigmore
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”表确定。问题是,如果我在其中一个连接中包含“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):
我将首先将查询更改为单表查询,并确保从中获得所需的内容,然后一次添加一个表,直到重复行开始出现 我最好的猜测是,您有一对表,其中需要在两个字段而不是一个字段上进行联接,并且单个字段联接与联接表中的多行相匹配,从而在输出中生成额外的行 另一种可能性是,您的一个表具有重复的行信息,这导致了重复的结果 您的
CourseModule
表可能是这两种情况下的问题
很难从您的问题中看出确切的解决方案,这是一个很好的问题,因为有很多表和许多联接
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