Как использовать SQL, чтобы определить, какие два студента совместно используют наибольшее количество классов?

#sql

#sql

Вопрос:

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

Я пытаюсь выяснить, какие два ученика посещали больше всего классов вместе. В результате должно быть напечатано имя первого студента, затем имя второго студента, затем имя класса, например: first_student_name, second_student_name, class_name

Данные хранятся странным образом. Это в трех таблицах со следующей схемой:

Студенты

student_id INT, student_first_name varchar, student_second_name varchar

КЛАСС

class_id INT, class_name varchar, student_first_name varchar, student_second_name varchar

XWALK

class_id INT, student_id INT

Есть ли в SQL простая функция, которая позволила бы мне сделать это, если я объединил все данные в одну таблицу? Я подумал, что, возможно, это можно было бы решить с помощью матричных функций во внутреннем запросе, подсчитывая class_ids, где ученик x и ученик y были в одном классе.

Любые советы о том, как собрать это вместе, были бы полезны!

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

1. MySQL или Postgres? Пожалуйста, отметьте только одну базу данных.

2. что вы хотите, если три студента используют наибольшее количество классов? если более одной пары студентов используют наибольшее количество классов?

3. кстати, это не странный способ. наличие таблиц для каждой вещи и таблицы для хранения связей между вещами — это обычный и лучший способ хранения таких данных

4. Желаемые результаты помогли бы. Вы указываете «имя класса» в единственном числе, но подразумевается, что у пары учеников будет более одного общего класса.

Ответ №1:

Если я правильно вас понял, вы можете самостоятельно объединить таблицу мостов xwalk , чтобы определить пары учеников, посещающих один и тот же класс, а затем объединить, чтобы подсчитать, сколько у них общих классов. Приведение имен студентов — это еще одна пара объединений. Наконец, мы можем отсортировать результат по количеству классов и сохранить только первую строку.

 select 
    s1.student_name as student_name_1,
    s2.student_name as student_name_2,
    count(*) cnt_classes
from xwalk w1
inner join xwalk x2 on x1.class_id = x2.class_id and x1.student_id < x2.student_id
inner join student s1 on s1.student_id = x1.student_id
inner join student s2 on s2.student_id = x2.student_id
group by s1.student_id, s2.student_id
order by count(*) desc limit 1