如何使用SQL确定哪两个学生共享最多的课程?

如何使用SQL确定哪两个学生共享最多的课程?,sql,Sql,我正在为学生们准备一个工具,以确定他们与其他学生共享哪些课程 我想知道哪两个学生一起上的课最多。结果应打印第一个学生姓名,然后打印第二个学生姓名,然后打印类名,如下所示: 第一名学生、第二名学生、班级 数据以一种奇怪的方式存储。它位于三个具有以下模式的表中: 学生 学生id INT,学生名字varchar,学生名字varchar 课程 class\u id INT,class\u name varchar,student\u first\u name varchar,student\u seco

我正在为学生们准备一个工具,以确定他们与其他学生共享哪些课程

我想知道哪两个学生一起上的课最多。结果应打印第一个学生姓名,然后打印第二个学生姓名,然后打印类名,如下所示: 第一名学生、第二名学生、班级

数据以一种奇怪的方式存储。它位于三个具有以下模式的表中:

学生

学生id INT,学生名字varchar,学生名字varchar

课程

class\u id INT,class\u name varchar,student\u first\u name varchar,student\u second\u name varchar

XWALK

班级id INT,学生id INT

如果我将所有数据合并到一个表中,SQL中是否有一个简单的函数允许我这样做?我在想,也许这可以通过内部查询中的矩阵函数来解决,计算学生x和学生y在同一个类中的类ID


任何关于如何将这些整合在一起的建议都会很有帮助

如果我没有听错,您可以自行加入bridge table
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
选择
s1.学生姓名作为学生姓名1,
s2.学生姓名作为学生姓名2,
计数(*)cnt_类
从xwalk w1
x1.class_id=x2.class_id和x1.student_id
MySQL还是Postgres?请仅标记一个数据库。如果三个学生共享最多的班级,您希望如何?如果两个以上的学生共用最多的班级?顺便说一句,这不是一种奇怪的方式。为每件事建立表格,并用表格来存储事物之间的关系,是存储这样的数据的常见且最好的方法。期望的结果会有所帮助。您可以用单数形式指定“类名”,但这意味着这对学生将有多个类在一起。