#mysql #sql
#mysql #sql
Вопрос:
У меня есть assignment
таблица, в которой хранятся задания, созданные учителем в определенном классе.
assignment
Таблица содержит следующие поля:
idAssignment (primary key),
classId (foreign key),
title,
assignmentDesc,
dateDue
У меня также есть assignmentsubmissions
таблица, в которую учащиеся этого класса загружают свои материалы для задания.
assignmentsubmission
Таблица содержит следующие поля:
assignmentSubmissionId (primary key),
assignmentId (foreign key),
userId (foreign key),
submission
В принципе, я хочу присоединиться assignmentsubmission
к assignment
для ученика в определенном классе, чтобы увидеть задания, которые они выполнили и не завершили.
Я пробовал несколько разных методов, но это моя текущая команда SQL:
SELECT *
FROM assignment
LEFT JOIN assignmentsubmission
ON assignment.idAssignment = assignmentsubmission.assignmentId
WHERE classId = 1234
AND ((userId = 1) OR (userId IS NULL))
Студент, возможно, еще не загрузил отправку для определенного задания, поэтому в этом случае для этого userId
не будет существовать assignment
, и я хочу объединить null
строки для assignmentsubmission
. В нынешнем виде все, что происходит, — это отображение только тех назначений, которые были отправлены, но я хочу, чтобы были возвращены все назначения с полями отправки или нулевого представления.
Я действительно борюсь с этой проблемой, поэтому буду признателен за любую помощь, спасибо.
Комментарии:
1. они завершены и не завершены, где хранится эта информация??
2. Диск из
User
таблицы. Это дало бы вам все задания, которые студент еще не загрузил. Если я вас правильно понимаю.3. @nikhilsugandh если студент загружает отправку, она сохраняется в таблице assignmentsubmission….
Ответ №1:
Вы на правильном пути, но сравнение со студентом должно быть в ON
предложении:
SELECT a.*, (asu.userId IS NOT NULL) as completed_flag
FROM assignment a LEFT JOIN
assignmentsubmission asu
ON a.idAssignment = asu.assignmentId AND
asu.userId = 1
WHERE a.classId = 1234 ;
В этой версии введены псевдонимы таблиц, которые облегчают запись и чтение запроса. Обратите внимание, что все ссылки на столбцы указаны — это означает, что таблица происхождения идентифицирована.
Комментарии:
1. миллион благодарностей за ваш ответ. Мне пришлось добавить в конце И (asu.userId РАВЕН NULL ИЛИ asu.userId = 1), чтобы учесть оба случая, когда либо студент имеет представление, либо нет. Если вы обновите приведенный выше код, я приму его как правильный ответ. Еще раз спасибо, только для вас я бы застрял на этой проблеме намного дольше!
2. @RussellBrady . . . Я думаю, что эта информация должна содержаться в столбце в
SELECT
.3. Ах, хорошо, я понимаю, у меня это работает сейчас, спасибо @GordonLinoff