Many_to_Many 的最佳实践

Best practice of Many_to_Many

我可以通过使用 foreachfor 循环到我的 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);