MySQL查询指定两学生共同教师数的实现方法求助
查询学生共同教师数量的可行方法
我明白你现在的需求——从关联学生和教师的teaching表里,找出指定两个学生(比如s1和s2)的共同教师数量,之前尝试INTERSECT和自连接没成功对吧?我给你几个肯定能行的方法,顺便说说可能你之前写法的问题:
方法一:正确的自连接写法
很多时候自连接没得到正确结果,是因为没处理重复或者连接条件不对,试试这个:
SELECT COUNT(DISTINCT t1.t_id) AS common_teacher_count FROM teaching t1 JOIN teaching t2 ON t1.t_id = t2.t_id WHERE t1.s_id = 's1' AND t2.s_id = 's2';
解释:把teaching表和自身做连接,连接条件是教师ID相同,分别筛选出s1和s2的记录,最后用COUNT(DISTINCT)统计不重复的教师ID数量(避免同个师生关系重复存储导致计数错误)。
方法二:子查询+IN语句
这种写法逻辑更直观,先找出其中一个学生的所有教师,再筛选另一个学生的交集:
SELECT COUNT(DISTINCT t_id) AS common_teacher_count FROM teaching WHERE s_id = 's1' AND t_id IN (SELECT t_id FROM teaching WHERE s_id = 's2');
解释:内层子查询先拿到s2的所有教师ID,外层查询过滤出s1的教师里属于这个列表的,再统计数量。
方法三:正确使用INTERSECT(适用于支持该语法的数据库)
如果你的数据库支持INTERSECT(比如PostgreSQL、SQL Server、Oracle),那正确的写法需要把交集结果放到子查询里统计:
SELECT COUNT(*) AS common_teacher_count FROM ( SELECT t_id FROM teaching WHERE s_id = 's1' INTERSECT SELECT t_id FROM teaching WHERE s_id = 's2' ) AS common_teachers;
解释:INTERSECT会返回两个查询的交集(也就是两个学生的共同教师ID),外层查询直接统计这个交集的行数,就是共同教师的数量。你之前可能没把INTERSECT的结果嵌套成子查询来计数,所以没得到正确数值。
内容的提问来源于stack exchange,提问作者Iliass Mw
相关产品推荐
相关产品推荐

