我在学生和测验表之间有多对多的关系,并且通常会使用3个表进行设置,每个表和一个联结表。我想列出所有学生的相应测验分数,并列出他们从未参加过的测验。这意味着即使他们在交界处没有任何关系,我也想接受该学生的测验
数据库的当前状态是我有3个学生和2个测验。前两个进行了第一次测验,但没有采取第二次测验。第三个学生都没有。这意味着联结表有两个条目,都指向测验1,前两个学生都有各自的分数。
我打算得到的结果是这样的:
student_id name quiz score total
1 john 1 5 10
1 john 2 10
2 jake 1 10 10
2 jake 2 10
3 jane 1 10
3 jane 2 10
现在,我有这个查询,我希望能够解决这个问题并获得构建该结构所需的所有数据:
SELECT
students.student_id,
students.formal_id,
students.last_name,
students.first_name,
quizzes.quiz_id,
quizzes.total,
quizzes.description,
_student_quiz.score
FROM
`quizzes`
LEFT JOIN _student_quiz //take all quizzes, regardless if the junction had anything for it
ON quizzes.quiz_id = _student_quiz.quiz_id
RIGHT JOIN students //take all students regardless if they are junctioned
ON _student_quiz.student_id = students.student_id
但是,它只返回包含学生的行和第一个测验
student_id name quiz score total
1 john 1 5 10
2 jake 1 10 10
3 jane NULL NULL 10
无论是否与学生有任何关系,我需要对所有学生和测验进行哪些更改?
答案 0 :(得分:2)
未经测试,但......我相信你需要两张桌子的笛卡尔积。
SELECT *
FROM students CROSS JOIN quizzes
LEFT JOIN _student_quiz ON _student_quiz.student.id = students.student_id
AND _student_quiz.quiz.id = quizzes.quiz.id