0

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

无论他们是否与之有任何关系,我都需要进行哪些更改才能获得所有学生和测验?

4

1 回答 1

2

未经测试,但是...我相信您需要两张表的carthesian 乘积。

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
于 2013-01-05T17:54:25.720 回答