SQL-запрос для максимальной регистрации и предварительных курсов - PullRequest
0 голосов
/ 25 февраля 2019

Привет У меня есть схема, которая выглядит следующим образом

Изображение схемы

Я пытался сделать эти 2 запроса

  1. Найдите 4 лучших преподавателей, чьи курсы имеют максимальную регистрацию по всем их объединенным курсам.

    Выходные столбцы: InstructorName, TotalEnrollment

    Сортировка по: TotalEnrollment в порядке убывания

  2. Перечислите все курсы, которые имеют предварительные условия, предлагаемые другим отделом.

    Выходные столбцы: Course_id, Course_department, Prereq_id, Prereq_department

    Сортировать по: Course_id в порядке возрастания

Для запроса 1 я написал

SELECT Instructor.i_id, Instructor.name, COUNT(Takes.s_id) AS totalEnrollment
FROM Instructor INNER JOIN Teaches
ON Instructor.i_id = Teaches.i_id
INNER JOIN Takes
ON Takes.course_id = Teaches.course_id
Group by Instructor.i_id, Instructor.name
ORDER BY totalEnrollment DESC;

Для запроса 2 я написал

SELECT Course.course_id, Course.dept_name, Prereq.prereq_id, Course.dept_name
FROM Course INNER JOIN Prereq   
ON Course.course_id = Prereq.course_id
INNER JOIN Course
ON Course.course_id = Prereq.prereq_id
Order by Course.course_id ASC;

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

---- query 1 result:
10101 Srinivasan            11
45565 Katz                   9
83821 Brandt                 6
76766 Crick                  2
15151 Mozart                 1
12121 Wu                     1
98345 Kim                    1
22222 Einstein               1
32343 El Said                1

Query 1 Expected:
Srinivasan           10
Brandt                2
Katz                  2
Crick                 2


---- Query 2 result:
BIO-301  Biology          BIO-101  Biology
BIO-399  Biology          BIO-101  Biology
CS-190   Comp. Sci.       CS-101   Comp. Sci.
CS-315   Comp. Sci.       CS-101   Comp. Sci.
CS-319   Comp. Sci.       CS-101   Comp. Sci.
CS-347   Comp. Sci.       CS-101   Comp. Sci.
EE-181   Elec. Eng.       PHY-101  Elec. Eng.

Query 2 Expected:
EE-181   Elec. Eng.       PHY-101  Physics

1 Ответ

0 голосов
/ 25 февраля 2019

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

Попробуйте это:

SELECT Instructor.i_id, Instructor.name, COUNT(Takes.s_id) AS totalEnrollment
FROM Instructor 
INNER JOIN Teaches ON Instructor.i_id = Teaches.i_id
INNER JOIN Takes ON Takes.course_id = Teaches.course_id
    AND Takes.sec_id = Teaches.sec_id -- added these 3 columnss
    AND Takes.semester = Teaches.semester
    AND Takes.year = Teaches.year
Group by Instructor.i_id, Instructor.name
ORDER BY totalEnrollment DESC;

Для второгозапрос, вам нужно использовать псевдоним, когда вы присоединяетесь к одной и той же таблице дважды, а также вы ничего не сделали, чтобы проверить, «предложен ли другой отдел».

SELECT Course.course_id, Course.dept_name, Prereq.prereq_id, c2.dept_name
FROM Course 
INNER JOIN Prereq 
ON Course.course_id = Prereq.course_id
INNER JOIN Course c2 -- alias
ON c2.course_id = Prereq.prereq_id
AND c2.dept_name <> Course.dept_name -- prereq department is different
Order by Course.course_id ASC;

Дайте мне знать, если еще естьпроблема с этим.

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