Many_to_Many 的最佳实践
Best practice of Many_to_Many
我可以通过使用 foreach
或 for
循环到我的 SQL 代码来解决这个问题,但我不想要这个。我知道我的答案可能只有一个 SQL 代码。
在这个 many_to_many 关系的答案中,我可以通过给定的学生 ID 或课程 ID 获得学生或课程。
但是如何通过给定不同的学生id来实现课程呢?我不想找一个学生但是很多学生。
这是我的 table 结构与给出的答案相同。
CREATE TABLE `Student` (
`StudentID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`FirstName` VARCHAR(25),
`LastName` VARCHAR(25) NOT NULL,
PRIMARY KEY (`StudentID`)
) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci
CREATE TABLE `Course` (
`CourseID` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
`Code` VARCHAR(10) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL,
`Name` VARCHAR(100) NOT NULL,
PRIMARY KEY (`CourseID`)
) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci
CREATE TABLE `CourseMembership` (
`Student` INT UNSIGNED NOT NULL,
`Course` SMALLINT UNSIGNED NOT NULL,
PRIMARY KEY (`Student`, `Course`),
CONSTRAINT `Constr_CourseMembership_Student_fk`
FOREIGN KEY `Student_fk` (`Student`) REFERENCES `Student` (`StudentID`)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `Constr_CourseMembership_Course_fk`
FOREIGN KEY `Course_fk` (`Course`) REFERENCES `Course` (`CourseID`)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=INNODB CHARACTER SET ascii COLLATE ascii_general_ci
例如:
1,5,78,32,54,7,44 id's的同学一定要给我他们的课程。如何使用 JOIN
?
执行此操作
我稍微修改了 Hammerite's answer 以便与几个 ID 一起使用:
Find all students registered for a course:
SELECT
Student
.* FROM
Student
JOIN CourseMembership
ON Student
.StudentID
= CourseMembership
.Student
WHERE
CourseMembership
.Course
in (1,5,78,32,54,7,44)
Find all courses taken by a given student:
SELECT
Course
.* FROM
Course
JOIN CourseMembership
ON Course
.CourseID
= CourseMembership
.Course
WHERE
CourseMembership
.Student
in (13,52,178,312,4,27,464)
请注意我编辑的粗体部分。
为什么不直接调用
SELECT student_id
FROM Students_Courses
WHERE course_id = desired_course_id
除非我误解了您想要获得的内容,否则这将为您提供所有 student_ids 表格,其中包含您将要研究的课程。
试一试-
SELECT st.studentid,st.first_name,cs.course_id,cs.course_name
FROM student st
JOIN coursemembership csm ON csm.student=st.studentid
JOIN course cs ON cs.courseid=csm.course
WHERE st.studentid IN (1,5,78,32,54,7,44);
我没有原始数据来检查这是否有效。如果适合您,请尝试一下
SELECT A.StudentID, CONCAT(A.FirstName, A.LastName) AS 'Name' , B.CourseID, B.Code, B.Name
FROM Student A, Course B, CourseMembership C
WHERE A.StudentID=C.Student AND B.CourseID=C.Course
AND A.Student IN (1,5,78,32,54,7,44);
我可以通过使用 foreach
或 for
循环到我的 SQL 代码来解决这个问题,但我不想要这个。我知道我的答案可能只有一个 SQL 代码。
在这个 many_to_many 关系的答案中,我可以通过给定的学生 ID 或课程 ID 获得学生或课程。
但是如何通过给定不同的学生id来实现课程呢?我不想找一个学生但是很多学生。
这是我的 table 结构与给出的答案相同。
CREATE TABLE `Student` (
`StudentID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`FirstName` VARCHAR(25),
`LastName` VARCHAR(25) NOT NULL,
PRIMARY KEY (`StudentID`)
) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci
CREATE TABLE `Course` (
`CourseID` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
`Code` VARCHAR(10) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL,
`Name` VARCHAR(100) NOT NULL,
PRIMARY KEY (`CourseID`)
) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci
CREATE TABLE `CourseMembership` (
`Student` INT UNSIGNED NOT NULL,
`Course` SMALLINT UNSIGNED NOT NULL,
PRIMARY KEY (`Student`, `Course`),
CONSTRAINT `Constr_CourseMembership_Student_fk`
FOREIGN KEY `Student_fk` (`Student`) REFERENCES `Student` (`StudentID`)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `Constr_CourseMembership_Course_fk`
FOREIGN KEY `Course_fk` (`Course`) REFERENCES `Course` (`CourseID`)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=INNODB CHARACTER SET ascii COLLATE ascii_general_ci
例如:
1,5,78,32,54,7,44 id's的同学一定要给我他们的课程。如何使用 JOIN
?
我稍微修改了 Hammerite's answer 以便与几个 ID 一起使用:
Find all students registered for a course:
SELECT
Student
.* FROMStudent
JOINCourseMembership
ONStudent
.StudentID
=CourseMembership
.Student
WHERECourseMembership
.Course
in (1,5,78,32,54,7,44)Find all courses taken by a given student:
SELECT
Course
.* FROMCourse
JOINCourseMembership
ONCourse
.CourseID
=CourseMembership
.Course
WHERECourseMembership
.Student
in (13,52,178,312,4,27,464)
请注意我编辑的粗体部分。
为什么不直接调用
SELECT student_id
FROM Students_Courses
WHERE course_id = desired_course_id
除非我误解了您想要获得的内容,否则这将为您提供所有 student_ids 表格,其中包含您将要研究的课程。
试一试-
SELECT st.studentid,st.first_name,cs.course_id,cs.course_name
FROM student st
JOIN coursemembership csm ON csm.student=st.studentid
JOIN course cs ON cs.courseid=csm.course
WHERE st.studentid IN (1,5,78,32,54,7,44);
我没有原始数据来检查这是否有效。如果适合您,请尝试一下
SELECT A.StudentID, CONCAT(A.FirstName, A.LastName) AS 'Name' , B.CourseID, B.Code, B.Name
FROM Student A, Course B, CourseMembership C
WHERE A.StudentID=C.Student AND B.CourseID=C.Course
AND A.Student IN (1,5,78,32,54,7,44);