Many_to_Many的最佳实践

时间:2015-06-29 06:45:48

标签: php mysql many-to-many

我可以通过对我的SQL代码使用foreachfor循环来解决这个问题,但我不想这样做。我知道我的答案可能只有一个SQL代码。

https://stackoverflow.com/a/2923921/1932414

在这个多关系的答案中,我可以通过给定的学生ID或课程ID来获得学生或课程。

但如何通过给定不同的学生ID来实现课程?我不想找一个学生,但是很多学生。

这是我的表结构与给出的答案相同。

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名学生必须给我他们的课程。如何使用JOIN

执行此操作

4 个答案:

答案 0 :(得分:1)

我稍微修改了Hammerite's answer以与多个ID一起使用:

  

查找注册课程的所有学生:

     

选择       Student。* FROM       Student       加入CourseMembership StudentStudentID = CourseMembershipStudent WHERE       CourseMembershipCourse in(1,5,78,32,54,7,44)

     

查找特定学生的所有课程:

     

选择       Course。* FROM       Course       加入CourseMembership CourseCourseID = CourseMembershipCourse WHERE       CourseMembershipStudent in(13,52,178,312,4,27,464)

注意粗体部分作为我的编辑。

答案 1 :(得分:1)

试一试 -

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);

答案 2 :(得分:0)

为什么不简单地调用类似

的内容
SELECT student_id
FROM Students_Courses
WHERE course_id = desired_course_id

除非我误解了你想要获得的内容,否则这将为你提供所有student_ids表格,供你学习的课程使用。

答案 3 :(得分:0)

我没有原始数据来检查这是否有效。如果它适合你,请试试这个

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);