MySQL условие значения в столбце не происходит - PullRequest
0 голосов
/ 10 декабря 2018

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

studentId - уникальный идентификатор студента.
studentLastname очевидно, фамилия студента.
examEntryStudentId - внешний ключ уникального идентификатора студента.
examEntryNumber -уникальный номер экзамена для студентов.
examInfoNumber такой же, но в таблице ExamInfo.
examInfoPassed определяет, сдали ли ученики или нет, 1 означает, что они сдали (более 50%), и 0 означает, что они сдали.

Идея в том, что я пересекаю таблицы с Student до ExamEntry до ExamInfo.Я хочу, чтобы сначала были выбраны все студенты, поскольку те, кто младше, еще не сдали официальный экзамен, поэтому я использую LEFT JOIN, чтобы все были выбраны, поскольку в противном случае они не будут отображаться так, как онине содержатся в пределах examEntryStudentId, так как не все студенты сдали экзамены.Кроме того, вы затем используете таблицу ExamEntry, чтобы перейти к таблице ExamInfo, где хранятся данные о том, провалил ли студент экзамен.Эти данные хранятся в examInfoPassed, поэтому, если у ученика когда-либо было значение 0 в examInfoPassed, это означает, что они должны быть единственными учениками, не включенными в мой вывод.

Это мойисходный код:

SELECT DISTINCT l.studentId, l.studentLastname
FROM Students l
LEFT JOIN ExamEntry e
ON l.studentId = e.examEntryStudentId
JOIN ExamInfo a
ON e.examEntryNumber = a.examInfoNumber
WHERE NOT a.examInfoPassed = 0
;

Несмотря на то, что мои выводы в настоящее время относятся к любому учащемуся, который сдал тест, включая студентов, которые ранее не прошли тест.Я не уверен, как сделать условие, которое означает, что если вы попадете в категорию NOT a.examInfoPassed = 0, то они будут удалены из вывода.Также студенты, которые не проходили никаких тестов, также не включены в мои результаты.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Исходя из вашего sql-кода, в настоящее время ваш запрос сообщает обо всех учениках, которые сдали хотя бы на экзамене , а вы хотите, чтобы те, кто сдал все экзамены .Кроме того, студенты, которые никогда не сдавали никаких экзаменов, исключаются, поскольку предложение WHERE ссылается на столбец из таблицы JOINed.

Вам необходимо изменить логику:

  • используйте LEFT JOIN s, чтобы обнаружить тех, кто не сдал хотя бы один экзамен

  • , а затем исключите их из условия WHERE (тем временем это позволит учащимся, которые никогда не сдавали экзамен,быть включенным в список вывода).

Запрос:

SELECT DISTINCT l.studentId, l.studentLastname
FROM Students l
LEFT JOIN ExamEntry e ON l.studentId = e.examEntryStudentId
LEFT JOIN ExamInfo a ON e.examEntryNumber = a.examInfoNumber AND a.examInfoPassed = 0
WHERE a.examInfoNumber IS NULL
0 голосов
/ 10 декабря 2018

Используйте агрегацию вместо:

SELECT l.studentId, l.studentLastname
FROM Students l LEFT JOIN
     ExamEntry e
     ON l.studentId = e.examEntryStudentId LEFT JOIN
     ExamInfo a
     ON e.examEntryNumber = a.examInfoNumber
GROUP BY  l.studentId, l.studentLastname
HAVING MIN(a.examInfoPassed) = 0 OR MIN(a.examInfoPassed) IS NULL;
...