如何编写MySQL查询找出人数非最大非最小的工作
解决思路与MySQL查询语句
没问题,我来帮你搞定这个需求!要找出员工数既不是最大值也不是最小值的工作,核心思路是先统计每个工作的员工数量,再排除掉人数为最大和最小的那些工作。下面给你两种可行的写法,适配不同版本的MySQL:
方法一:兼容所有MySQL版本(使用子查询)
这种写法不需要依赖MySQL 8.0+的新特性,适合所有版本:
SELECT p.WORK FROM PEOPLE p GROUP BY p.WORK -- 关联WORK表确保结果是合法工作(可选,根据实际业务需求添加) JOIN WORK w ON p.WORK = w.WORK HAVING COUNT(p.ID) NOT IN ( -- 先获取所有工作的员工数,再取出最小值 SELECT MIN(cnt) FROM (SELECT COUNT(ID) AS cnt FROM PEOPLE GROUP BY WORK) AS t UNION ALL -- 再取出最大值 SELECT MAX(cnt) FROM (SELECT COUNT(ID) AS cnt FROM PEOPLE GROUP BY WORK) AS t );
逻辑拆解:
- 内层的子查询先统计每个工作的员工数,然后分别取出其中的最小值和最大值;
- 外层通过
GROUP BY统计每个工作的员工数,用HAVING排除掉人数等于最小或最大值的工作; - 可选的
JOIN WORK是为了确保结果只包含WORK表中存在的合法工作(避免PEOPLE表中出现脏数据)。
方法二:使用CTE(MySQL 8.0及以上版本)
如果你的MySQL版本是8.0或更高,用CTE(公共表表达式)会让逻辑更清晰易读:
-- 第一步:统计每个工作的员工数量 WITH WorkCounts AS ( SELECT WORK, COUNT(ID) AS emp_count FROM PEOPLE GROUP BY WORK ), -- 第二步:找出所有工作人数中的最小值和最大值 MinMaxCounts AS ( SELECT MIN(emp_count) AS min_cnt, MAX(emp_count) AS max_cnt FROM WorkCounts ) -- 第三步:筛选出人数既不是最小也不是最大的工作 SELECT wc.WORK FROM WorkCounts wc -- 可选:关联WORK表确保合法工作 JOIN WORK w ON wc.WORK = w.WORK JOIN MinMaxCounts mm ON wc.emp_count != mm.min_cnt AND wc.emp_count != mm.max_cnt;
逻辑验证(针对你的示例数据)
根据你提供的示例数据:
- Programmer对应2名员工,Singer对应1名,Welder对应3名
- 最小员工数是1,最大是3
- 排除这两个数值后,剩下的就是员工数为2的Programmer,完全符合预期结果。
内容的提问来源于stack exchange,提问作者CoderJammer
相关产品推荐
相关产品推荐

