繁体   English   中英

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

[英]MySQL many-to-many join even if there is no relation

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

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

未经测试,但......我相信你需要两张桌子的贝塞斯特产品。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM