如何查询多个多对多关系insql

时间:2017-09-24 20:00:04

标签: mysql sql

我们假设我有5张桌子

    CREATE TABLE Student
    (
        id int not null primary key auto_increment,
        firtsname varchar(30)
    );


   CREATE TABLE Lecture  
   (
       id int not null primary_key auto_increment,
       lecturename varchar(30)
   );

   CREATE TABLE Teacher
   (
       id int not null primary key auto_increment,
       name varchar(30)
   );

   CREATE TABLE StudentLecture
   (
       StudentID int,
       LectureID int,
       foreign key(StudentID) references Student(id),
       foreign key(LectureID) references Lecture(id)
   );

   CREATE TABLE TeacherLecture
   (
       TeacherID int,
       LectureID int,
       foreign key(TeacherID) references Teacher(id),
       foreign key(LectureID) references Lecture(id)
   );

我们假设我将一些数据放入每个表中。 我的问题是,是否有一种简单的方法可以在一个查询中获得包含学生教师和讲座的结果? 我的意思是我想得到类似的东西: 学生'x'被分配到'teacherY',由'teacherZ'领导。

或许这个小型数据库的设计很差,我是新手,还在阅读和尝试。

第二个问题是,如何在这个数据库中正确地制作成绩。 成绩应由教师提供,每个学生都应该有每个讲座的成绩列表。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

应该可以正常工作。

select s.firstname,t.name,l.lecturename from Student s 

join StudentLecture sl on (sl.StudentID = s.id) 
join TeacherLecture tl on (tl.LectureID = sl.LectureID) 
join Teacher t on (t.id = tl.TeacherID) 
join Lecture l on (l.id = sl.LectureID)

答案 1 :(得分:0)

对于第一个问题,你的桌子看起来不错,可以完成你想要的工作,因为每个讲座都有学生和老师,那么你可以使用一个表StudentLectureDetails而不是两个;一个用于StudentLecture,另一个用于TeacherLecture

CREATE TABLE StudentLectureDetails
(
       LectureID int,
       TeacherID int,
       StudentID int, 
       foreign key(LectureID) references Lecture(id),
       foreign key(TeacherID) references Teacher(id),
       foreign key(StudentID) references Student(id)
);

然后,您可以直接从此表中检索所需的数据:

SELECT * FROM StudentLectureDetails

请注意,这并不意味着您选择的架构是错误的,这只是一个偏好问题,当您必须进行与{{{{{{{{{{{{{{{{{{{{ 1}}并且您不希望其他细节使您的查询复杂化。当您的数据很大并且您不希望在TeacherLecture中保存更多信息时,它也会更好。因此,如果你现在保持你的架构,那么你可以使用@Md Shifatul Islam提到的答案来检索你想要的数据。

对于第二个问题:您还可以将学生成绩作为另一列添加到同一个StudentLectureDetails表中,因为它完全取决于学生的详细信息。讲座,或者你可以只为学生使用另一张桌子'讲座成绩(StudentLectureDetailsStudentIDLectureID)但不提及老师。