Левое объединение таблицы при условии, которое может быть нулевым, и объединение нулевых столбцов, если условие равно нулю

#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