0

私は学生とクイズ テーブルの間に多対多の関係を持っており、通常はセットアップに 3 つのテーブルを使用し、それぞれに 1 つとジャンクション テーブルを使用します。すべての生徒を対応するクイズのスコアとともにリストアップし、また、彼らが受けたことのないクイズもリストアップしたいと思います。これは、ジャンクションで関係がなくても、その学生をそのクイズに連れて行きたいということです

データベースの現在の状態は、3 人の生徒と 2 つのクイズがあります。最初の 2 人は 1 回目のクイズを受けましたが、2 回目は受けませんでした。3 番目の生徒はどちらも受けませんでした。これは、ジャンクション テーブルに 2 つのエントリがあり、どちらもクイズ 1 と、それぞれのスコアを持つ最初の 2 人の学生の両方を指していることを意味します。

私が得ようとしている結果は次のようになります。

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

テストされていませんが... 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
于 2013-01-05T17:54:25.720 に答える