SQL Проблема со второй частью запроса WHERE NOT EXIST - PullRequest
1 голос
/ 02 апреля 2020

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

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

SELECT Course_Code, Course_Sequence, Prereq_ID
FROM Curriculum 
WHERE NOT EXISTS
(SELECT * FROM Transcript 
WHERE curriculum.course_code = transcript.course_code
AND transcript.CWID = "C38475920"); 

Однако мне нужно сузить запрос еще больше, чтобы я не рекомендовал студенту курс, имеющий обязательное условие курса, которого студент не делает. встретиться. Prereq_ID в таблице учебных программ содержит предварительные условия для каждого курса. Я полностью застрял в том, как добавить дополнительный код в запрос выше и получить результат, который возвращает все curriculum.Course_Code, которые не находятся в заданной c расшифровке студента (CWID - это идентификатор студента. Каждый класс у студента есть соответствующий CWID) , а также убедитесь, что необходимое условие выполнено, возможно, добавив что-то подобное? transcript.Course_Code = curriculum.Prereq_ID

Если это не имеет смысла, я знаю, что это неправильно SQL, но:

SELECT curriculum.Course_Code
FROM curriculum 
WHERE curriculum.Course_Code  IS NOT IN transcript 
AND transcript.Course_Code = curriculum.Prereq_ID
AND transcript.CWID = "C38475920”;

Вот таблица учебных программ и стенограмм:

protected $table ="curriculum";
    protected $fillable = [
      'Program_ID', //Primary Key //int
      'Curriculum_ID', //varchar
      'Maj_Code',//varchar
      'Course_Code',//varchar
      'Course_Seq', //int
      'Prereq_ID',//varchar
      'Course_Desc',//varchar
    ];
    protected $table ="transcript";
    protected $fillable = [
      'Transcript_ID', //primary key 
      'CWID', //foreign key //varchar
      'Maj_Code', //varchar
      'Curriculum_ID', //varchar
      'Course_Comp',//varchar
      'Term_Completed',//varchar
      'Course_Grade',//varchar
      'Course_Code',//varchar
    ];

Надеюсь, это поможет мне понять результат. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Возможно, вам нужен следующий запрос. Ваш вопрос сбивает с толку, потому что вы заявляете «CWID - это идентификационный номер студента», но сразу после этого вы противоречите себе, говоря: «Каждый урок, который прошел студент, имеет соответствующий CWID». Таким образом, CWID не является уникальным идентификатором для студента, возможно, это уникальный идентификатор для соединения студента и пройденного курса. В любом случае, вероятно, существует таблица student, которая отсутствует в том, что вы опубликовали выше, но я думаю, что вы можете решить свою проблему, имея идентификационный номер студента. Предположительно, у студента может быть только один идентификационный номер. 1009 * prereq_id представляет course_id, что является обязательным условием для курса в каждой строке таблицы curriculum

course_id уникален, никакие два разных курса не могут иметь одинаковое значение ( для различных program_id значений, например)

Меня смущает значение program_id, потому что вы говорите, что этот столбец является первичным ключом, а course_id - нет, на curriculum стол. Это не имеет смысла. Предположительно, «программа» - это что-то вроде биологии, образования, бухгалтерского учета и т. Д. c. и такие программы будут иметь более 2 курсов. Как может program_id быть первичным ключом в таблице, где есть столбец course_code, если в программе должно быть более 2 курсов ...?

select    c.course_code
          c.course_sequence
          c.prereq_id
from      curriculum      c
     join transcript      t
       on c.prereq_id = t.course_code
left join transcript      x 
       on c.course_code = x.course_code
      and t.transcript_id = x.transcript_id
where     t.transcript_id = 'xxxxx'
      and x.course_code is null;
0 голосов
/ 02 апреля 2020

Я думаю, что это сработает, сначала получите все курсы из учебного плана, которого нет в стенограмме, а затем выполните внутреннее соединение (чтобы получить пересечение) с транскриптом снова на основе prereq_id, совпадающего с кодом_курса. Может быть, ключевое слово не требуется.

select distinct course_code from ( select c.* from curriculum as c where c.course_code not in ( select t.course_code from transcript as t where t.CWID = 'C38475920') ) as c2 inner join transcript t2 on t2.course_code = c2.Prereq_ID;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...