Как показать все тесты, оценки студентов и если они взяли тест из 4 таблиц - PullRequest
1 голос
/ 28 ноября 2011

У меня есть следующие 4 таблицы:

Teacher: id, teacher

Student: id, student

Quiz: id, teacher_id, answer, dis_1, dis_2, dis_3

Intermediate: id, student_id, teacher_id, score

Учителя создают викторины, а студенты - викторины. Промежуточная таблица отслеживает результаты тестов с соответствующими идентификаторами.

Я хотел бы вернуть все тесты и указать либо балл студента, либо то, что они его не взяли.

Если они не прошли тест, в промежуточной таблице не будет записи для этого ученика. Если они пройдут тест, то промежуточная таблица будет иметь счет.

Это мое заявление:

SELECT Quiz.question as question, 
Quiz.id as id,  Quiz.title as title,
Quiz.teacher_id as teacher_id, Teacher.teacher as teacher, 
Quiz.answer as answer, Quiz.dis_1 as dis1, 
Quiz.dis_2 as dis2, Quiz.dis_3 as dis3,
Intermediate.score as score 
FROM Teacher, Intermediate 
RIGHT JOIN Quiz ON Quiz.id = Intermediate.quiz_id 
RIGHT JOIN Student ON Student.id = Intermediate.student_id 
WHERE Quiz.teacher_id = Teacher.id

Когда я пробую это утверждение, я получаю все пройденные тесты, и в нем отображается оценка для того, кто только что его принял. Я хочу, чтобы он просто отображал счет, если он существует в промежуточной таблице.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2011

WHERE Quiz.teacher_id = Teacher.id это преобразование ваших правых объединений во внутренние объединения.

Также мне трудно рассуждать о ПРАВЫХ СОЕДИНЕНИЯХ, поэтому я преобразовал их в ЛЕВЫЕ СОЕДИНЕНИЯ

SELECT
    Quiz.question as question, 
    Quiz.id as id,  Quiz.title as title,
    Quiz.teacher_id as teacher_id, Teacher.teacher as teacher, 
    Quiz.answer as answer, Quiz.dis_1 as dis1, 
    Quiz.dis_2 as dis2, Quiz.dis_3 as dis3,
    Intermediate.score as score 

FROM
  student
  LEFT JOIN Intermediate 
    ON  Student ON Student.id = Intermediate.student_id
  LEFT JOIN Quiz 
    ON Quiz.id = Intermediate.quiz_id
  LEFT JOIN Teacher
    ON Quiz.teacher_id = Teacher.id

Возможно, вы также захотите добавить что-нибудь из Student, чтобы не получить кучу нулей

Возможно, вы захотите добавить оператор выбора, подобный этому, в оператор выбора

CASE WHEN Intermediate.score is null then 'not taken' else 'taken' end IsTaken
0 голосов
/ 28 ноября 2011

Вы, кажется, рядом. Одна вещь, которая может вызывать у вас проблемы:

FROM Teacher, Intermediate

Когда вы комбинируете таблицы без использования явного синтаксиса INNER/RIGHT/LEFT JOIN, это часто может привести к нежелательным результатам, особенно для внешних объединений. Вы можете прочитать больше о MySQL JOINS , который может помочь вам двигаться вперед.

Вы также не указали имя учащегося, которое я добавил, чтобы вы увидели имя человека, связанного с оценкой. Если у вас есть ученик, который не прошел тест, его имя и оценка будут NULL, из-за того, как работает LEFT OUTER JOIN (возвращение всех строк из левой таблицы и совпадение строк или NULL для правильный стол)

SELECT q.question, q.id, q.title, q.teacher_id, t.teacher
   , q.answer, q.dis_1, q.dis_2, q.dis_3, s.student, i.score
FROM Quiz AS q
LEFT OUTER JOIN [Intermediate] AS i ON q.id = i.quiz_id
LEFT OUTER JOIN Teacher AS t ON i.teacher_id = t.teacher_id
LEFT OUTER JOIN Student AS s ON i.student_id = s.student_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...