[英]Is this database structure correct or is there a better way?
我有三个表,Student,StudentClass和Class表。 学生表显示学生信息,班级表显示大学中正在进行的课程,而学生班级表将学生链接到他们的教室。 问题是,如果我创建一个查询,如果我同时连接所有三个表,则会在查询中得到重复的行。 所以我的问题是,我是否应该使用这三个表来创建像这样的学生和教室数据库,还是有一种更有效,更好的方法来做到这一点? 还有其他表格,但我希望您仅关注这三个表格。 谢谢
下表是:
Student Table:
StudentId(PK) StudentForename StudentSurname Year StudentUsername CourseId(FK)
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(PK) StudentId(PK)
101 S1
102 S3
103 S1
104 S2
Class Table:
ClassId(PK) Room ClassDay ClassTime ModuleId(FK) CourseId(FK) TeacherId(FK)
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
在下面查询:(在哪里从表格中简单查找在文本框中输入的数据)
SELECT * FROM Module m
INNER 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
JOIN Course c ON st.CourseId = c.CourseId
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)."')
您的架构看起来不错,但是查询比必要的要复杂得多。 请尝试以下操作:
select *
from Student s, Class c, StudentClass sc
where s.StudentId = sc.StudentId
and c.ClassId = sc.ClassId
内部联接在此查询中是隐式的; 它应该给你四行对应于StudentClass
的行。 请注意,您将两次看到Mayur Patel:一次是在周四的CHI2550中,一次是在星期一的CHT2520中。
如果要基于表单字段进行其他过滤,则这些过滤器将是多余的and
子句。
您的查询将如下所示:
select *
from Student as s
left join
StudentClass as sc
on
s.StudentId = sc.StudentId
right join
Class as c
on
sc.ClassId = c.ClassId
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.