#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
предоставить только студенту и преподавателю максимальное количество общих курсов. Разве это не работает?