Найти id студентов, которые проходят каждый курс, в MySQL

У меня есть 3 таблицы:

Student (Id, Name, Country) 
Course (CrsCode, CrsName, Type, Instructor) 
Results(Id, CrsCode, Grade)

Я должен решить ниже q с помощью запроса SQL. Id и CrsCode являются ключевыми полями в каждой таблице. Поле Тип указывает тип курса, например, MATH, STAT, SYSC, TTMG, ELEC и т. Д.

  1. Найдите Id студентов, которые посещают курсы TTMG или SYSC.
  2. Найдите Id студентов, которые берут каждый курс.
  3. Найдите идентификатор студентов, которые проходят каждый курс TTMG или каждый курс SYSC.

Ниже приведены примеры данных для части 3. 1-е изображение - таблица курса, 2-е изображение - таблица результатов.

Я могу решить 1-й вопрос, используя следующий запрос SQL:

SELECT R.ID FROM RESULTS R JOIN COURSE C ON C.CRSCODE = R.CRSCODE WHERE C.TYPE="TTMG" OR C.TYPE ='SYSC

По второму вопросу, я полагаю, мы должны снова 2nd (Course) and 3rd (Results) table in order to get the result, Мы должны связать конкретный случай здесь. We have to consider a case that there is one specific student who is taking all courses(CrsCode) and we have to find the id of that student,

Я считаю, что запрос будет таким же, как в вопросе 1, но на этот раз будут небольшие изменения:

SELECT R.ID FROM RESULTS R JOIN COURSE C 

Я не включаю ничего после КУРСА C, потому что я не уверен, что ответ после этого. Любые указатели будут высоко оценены.

1 ответ

Решение

Найдите Id студентов, которые берут каждый курс.

Предполагая, что таблица курса содержит все курсы, которые студент может пройти, вы можете group by столбец id в results таблицы и проверьте, равен ли счет числу строк в course Таблица.

SELECT ID
FROM RESULTS
GROUP BY ID
HAVING COUNT(DISTINCT CRSCODE) = (SELECT COUNT(*) FROM COURSE)

Изменить: на основе комментария ОП

Найдите идентификатор студентов, которые проходят каждый курс TTMG или SYSC

SELECT r.id
FROM  course c
JOIN RESULTS r on c.CRSCODE=r.CRSCODE
GROUP BY r.ID 
HAVING COUNT(case when type = 'SYSC' then r.CRSCODE end)  = (SELECT COUNT(*) FROM COURSE WHERE type = 'SYSC')
OR COUNT(case when type = 'TTMG' then r.CRSCODE end) = (SELECT COUNT(*) FROM COURSE WHERE type = 'TTMG')

Sample Demo

Другие вопросы по тегам