поиск студента и преподавателя с наибольшим количеством общих курсов

#mysql

#mysql

Вопрос:

Мне нужно найти, у какого преподавателя и студента больше всего пересекающихся курсов (если таковые имеются), используя скрипт MySQL. Я создал свою собственную базу данных со следующими таблицами: Студенты (идентификатор, имя, фамилия) Профессора (идентификатор, имя, отчество) Курсы (идентификатор, название) Оценки (идентификатор студента, идентификатор курса, задание, оценка)

Мыслительный процесс:

Мне нужно составить список студентов, преподавателей и курсов:

     select distinct students.first_name, professors.first_name, course_name from grades
    join students on grades.student_id = students.student_id
    join courses on grades.course_id = courses.course_id
    join professors on courses.professor_id = professors.professor_id
  

Результат приведенного выше запроса

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

Комментарии:

1. обновите свой вопрос, добавьте надлежащую выборку данных и ожидаемый результат

Ответ №1:

Используя ваш запрос в качестве основы для начала, вы можете group by студенту и преподавателю получить количество общих курсов.
Приведенный ниже запрос возвращает студентов и профессоров, у которых есть наиболее распространенные курсы:

 with cte as (
  select 
    #I had to alias these column names to avoid a duplicate column name error (Quito)
    students.first_name, students.last_name,
    professors.first_name, professors.last_name, 
    count(distinct courses.id) counter 
  from grades
  join students on grades.student_id = students.student_id
  join courses on grades.course_id = courses.course_id
  join professors on courses.professor_id = professors.professor_id
  group by 
    students.first_name, students.last_name,
    professors.first_name, professors.last_name
)

select * from cte
where cte.counter = (
  select max(counter) from cte
)
  

Комментарии:

1. Вот и все! Но есть ли способ не умножать результирующий набор на 4? Хелли и Элмкуок используют оба класса по 2 с Mopointy, но результат запроса указывает 8 для счетчика. Это из-за объединения, верно? Могу ли я исправить это с помощью coalesce?

2. Я использовал having counter > 1 с distinct вызовом. Я получаю правильный результат. Я пытаюсь включить max , чтобы показывать только самые высокие (в случае, если есть разные соединения; например, 3 или 4).

3. Разве вам не нужна только 1 строка с максимальным количеством общих курсов? Это можно сделать с помощью order by. Max() потребуется дополнительная группировка.

4. Мне нужно найти студента (ов), которые посещают более одного занятия у профессора. Возможно, подходит более одного студента (в данном случае). Но я думаю, что universal для другого набора данных, возможно, есть несколько студентов с 3 или 4 классами. И если есть несколько курсов с наибольшим значением, мне нужно показать только их. Прямо сейчас, с counter > 1 он покажет все с 2 или более классами. Как я могу показать студентам максимальное значение для счетчика? Я поместил это вокруг оператора count и сказал invalid use of group function .

5. having counter > 1 это был мой первоначальный ответ, и я отредактировал его, чтобы order by counter desc limit 1 предоставить только студенту и преподавателю максимальное количество общих курсов. Разве это не работает?