You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

解释:

  1. 内层子查询按module_id分组,用COUNT(DISTINCT instructor_id)统计每个模块的不同讲师数量,筛选出数量>1的模块ID
  2. 外层查询关联三张表,只保留属于这些模块的记录,用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;

解释:

  1. 内层查询用窗口函数OVER (PARTITION BY m.module_id)给每个模块的所有记录添加上该模块的讲师总数
  2. 外层直接筛选出讲师总数>1的记录,同样用DISTINCT去重

两种方法都能实现你的需求,你可以根据自己的数据库版本和习惯选择~

内容的提问来源于stack exchange,提问作者Samit Paudel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:12:09