连接具有多对多关系的表
Joining tables with a many to many relationship
assuming these 3 tables:
student - | student_id | name | sex | - 31 students
score - | event_id | student_id | grade | - 173 total grades
event - | event_id | type | date | - 6 events
this means there could be a total of 186 entries in the grade book,
6 for every student, some or none of which could be NULL.
我试图通过使用这些 table 来理解联接。我正在尝试加入他们,以便我可以获得所有学生在分配给他们的各种 quizzes/tests 中的所有成绩。有些学生没有某些事件的成绩,因此不会出现在标准的内部连接查询中(如预期的那样)。但是,我希望所有学生都出现,无论是否为 NULL,因为每个事件都有所有学生都可以参加的活动。但是,我只能成功地取回分数 table 中记录了成绩的学生的数据。我不确定我做错了什么或从这里去哪里。
The query I was trying:
SELECT st.student_id, st.name, e.date, e.type, sc.score
FROM event e LEFT JOIN score sc
ON e.event_id = sc.event_id
RIGHT JOIN student st
ON sc.student_id = st.student_id
现在我想我知道为什么它不起作用,只是不知道它的解决方案。 LEFT 和 RIGHT 联接的工作原理是,如果指定的 table 中的记录不匹配,则将在需要的地方附加适当的 NULL 值。但是,由于所有学生至少有一个成绩,从技术上讲,RIGHT JOIN 是满足的,因为每个学生至少有一个匹配记录。我可以看到如何修改我在事件和分数之间的连接可以证明很容易地解决这个问题,但同样,我只是不确定我在做什么。
首先您需要创建所有 186 个选项 event/student。
SELECT *
FROM student
CROSS JOIN event
然后您使用 LEFT JOIN
尝试将 score
分配给每个事件
SELECT *
FROM student
CROSS JOIN event
LEFT JOIN score
ON score.student_id = student.student_id
AND score.event_id = event.event_id
因为您在 LEFT
端已经有了 186,所以当在 score
table[=16 上找不到匹配项时,您将拥有那些具有 NULL 值的组合=]
assuming these 3 tables:
student - | student_id | name | sex | - 31 students
score - | event_id | student_id | grade | - 173 total grades
event - | event_id | type | date | - 6 events
this means there could be a total of 186 entries in the grade book,
6 for every student, some or none of which could be NULL.
我试图通过使用这些 table 来理解联接。我正在尝试加入他们,以便我可以获得所有学生在分配给他们的各种 quizzes/tests 中的所有成绩。有些学生没有某些事件的成绩,因此不会出现在标准的内部连接查询中(如预期的那样)。但是,我希望所有学生都出现,无论是否为 NULL,因为每个事件都有所有学生都可以参加的活动。但是,我只能成功地取回分数 table 中记录了成绩的学生的数据。我不确定我做错了什么或从这里去哪里。
The query I was trying:
SELECT st.student_id, st.name, e.date, e.type, sc.score
FROM event e LEFT JOIN score sc
ON e.event_id = sc.event_id
RIGHT JOIN student st
ON sc.student_id = st.student_id
现在我想我知道为什么它不起作用,只是不知道它的解决方案。 LEFT 和 RIGHT 联接的工作原理是,如果指定的 table 中的记录不匹配,则将在需要的地方附加适当的 NULL 值。但是,由于所有学生至少有一个成绩,从技术上讲,RIGHT JOIN 是满足的,因为每个学生至少有一个匹配记录。我可以看到如何修改我在事件和分数之间的连接可以证明很容易地解决这个问题,但同样,我只是不确定我在做什么。
首先您需要创建所有 186 个选项 event/student。
SELECT *
FROM student
CROSS JOIN event
然后您使用 LEFT JOIN
尝试将 score
分配给每个事件
SELECT *
FROM student
CROSS JOIN event
LEFT JOIN score
ON score.student_id = student.student_id
AND score.event_id = event.event_id
因为您在 LEFT
端已经有了 186,所以当在 score
table[=16 上找不到匹配项时,您将拥有那些具有 NULL 值的组合=]