Mysql объединяет четыре таблицы и показывает значение NULL - PullRequest
2 голосов
/ 04 ноября 2011

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

Вот мои четыре стола

  1. Student стол
  2. Scores таблица
  3. Student
  4. student_subject

enter image description dsds

enter image description here

enter image description here

enter image description here

Ссылка на мою таблицу

  • Таблица результатов (user_id) с таблицей учеников (user_id)
  • Таблица экзаменов (id) с таблицей баллов (exam.id)
  • student_subject (user_id) с таблицей учеников (user_id)

  • student_subject (group_id) с таблицей экзаменов (group_id) (моя база данных группы находится в другой базе данных по какой-то важной причине)

Мой запрос работает, но у меня нет значения NULL для учащегося, у которого нет ввода его оценки

SELECT 
    scores.result, students.id, exam.name, exam.id
FROM 
    scores
LEFT JOIN  
    students ON scores.user_id = students.user_id
LEFT JOIN 
    exam ON exam.id = scores.exam_id
LEFT JOIN 
    students_subjects as ss ON ss.user_id = students.id
LEFT JOIN 
    students_subjects ON students_subjects.group_id = exam.group_id
WHERE
    exam.id = 32
GROUP BY
    scores.id
* * Выход тысяча сорок-девять

enter image description here

Как я могу получить нулевое значение для каждого студента, у которого нет оценки для конкретного экзамена (exam.id = 32)?

Отредактировано для @ sceaj

Я получил это по вашему запросу (я изменяю WHERE exam.id = 34 для WHERE exam.id = 36 для лучшего тестирования)

SELECT scores.result,students.id,exam.name, exam.id
FROM exam
INNER JOIN students_subjects ON students_subjects.group_id = exam.group_id
INNER JOIN students ON students_subjects.user_id = students.user_id
LEFT OUTER JOIN scores ON scores.user_id = students.user_id
WHERE exam.id = 36

enter image description here

Ответы [ 2 ]

2 голосов
/ 04 ноября 2011

Следующее должно вернуть всех студентов, с оценками по экзамену 32, если они существуют.

SELECT scores.result,students.id,exam.name, exam.id
FROM exam
INNER JOIN scores ON exam.id = scores.exam_id
RIGHT OUTER JOIN students ON scores.user_id = students.user_id
WHERE exam.id = 32

В предложении select не использовалось ничего из студентов_субъектов или статистических функций, поэтому я не уверенприсоединиться к нему было для?Возможно, вы можете начать с вышеизложенного и строить оттуда.

Редактировать: Новая стратегия, основанная на моем первом комментарии.Попробуйте найти всех учеников, а затем найдите существующие оценки, ноль, если их нет.

SELECT scores.result,students.id,exam.name, exam.id
FROM exam
INNER JOIN students_subjects ON students_subjects.group_id = exam.group_id
INNER JOIN students ON students_subjects.user_id = students.user_id
LEFT OUTER JOIN scores ON scores.user_id = students.user_id
  AND scores.exam_id = exam.id
WHERE exam.id = 32
0 голосов
/ 04 ноября 2011

Не начинайте с таблицы результатов, оставьте соединение со всеми остальными: вы получите только строки, в которых значение не равно нулю.Вместо этого сделайте правильное соединение или поместите таблицу результатов в конец:

SELECT scores.result,students.id,exam.name, exam.id
FROM 
students LEFT JOIN scores ON scores.user_id = students.user_id
LEFT  JOIN exam on exam.id = scores.exam_id
LEFT JOIN students_subjects as ss ON ss.user_id = students.id
LEFT JOIN students_subjects ON students_subjects.group_id = exam.group_id
where exam.id = 32
group by scores.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...