即使没有关系,MySQL也会多对多加入

时间:2013-01-05 17:50:06

标签: mysql

我在学生和测验表之间有多对多的关系,并且通常会使用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

无论是否与学生有任何关系,我需要对所有学生和测验进行哪些更改?

1 个答案:

答案 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