SQL表关联下的条件COUNT查询:筛选多讲师模块
解决筛选多讲师模块的SQL查询问题
没问题,我来帮你搞定这个需求——只找出那些有多名讲师的模块,同时列出这些模块对应的所有讲师。咱们先看看你原来的子查询里的几个小问题:
- 子查询的
SELECT语句中,列之间少了逗号(module_name, Instructor_name和COUNT之间需要逗号) - 没有用
GROUP BY来按模块分组统计讲师数量 - 筛选聚合结果应该用
HAVING而不是WHERE,因为WHERE是在聚合前过滤行,HAVING才是在聚合后筛选分组结果
下面给你两种可行的解决方案:
方法一:子查询 + IN 子句
这种方法先找出所有有多名讲师的模块ID,再关联原表获取详细信息,兼容性很好,几乎所有数据库都支持:
SELECT DISTINCT m.module_name, i.instructor_name FROM InstructorMailingAddressModPer imp JOIN Module m ON imp.module_id = m.module_id JOIN Instructor i ON imp.instructor_id = i.instructor_id WHERE imp.module_id IN ( -- 子查询:找出讲师数量大于1的模块ID SELECT module_id FROM InstructorMailingAddressModPer GROUP BY module_id HAVING COUNT(DISTINCT instructor_id) > 1 ) ORDER BY m.module_name;
解释:
- 内层子查询按
module_id分组,用COUNT(DISTINCT instructor_id)统计每个模块的不同讲师数量,筛选出数量>1的模块ID - 外层查询关联三张表,只保留属于这些模块的记录,用
DISTINCT避免同一讲师同一模块重复出现的情况
方法二:窗口函数(更简洁高效)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),可以用这种更简洁的写法:
SELECT DISTINCT module_name, instructor_name FROM ( SELECT m.module_name, i.instructor_name, -- 按模块分区,统计该模块的讲师总数 COUNT(DISTINCT i.instructor_id) OVER (PARTITION BY m.module_id) AS instructor_count FROM InstructorMailingAddressModPer imp JOIN Module m ON imp.module_id = m.module_id JOIN Instructor i ON imp.instructor_id = i.instructor_id ) AS module_instructors WHERE instructor_count > 1 ORDER BY module_name;
解释:
- 内层查询用窗口函数
OVER (PARTITION BY m.module_id)给每个模块的所有记录添加上该模块的讲师总数 - 外层直接筛选出讲师总数>1的记录,同样用
DISTINCT去重
两种方法都能实现你的需求,你可以根据自己的数据库版本和习惯选择~
内容的提问来源于stack exchange,提问作者Samit Paudel
相关产品推荐
相关产品推荐

