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

如何编写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
);

逻辑拆解:

  1. 内层的子查询先统计每个工作的员工数,然后分别取出其中的最小值和最大值;
  2. 外层通过GROUP BY统计每个工作的员工数,用HAVING排除掉人数等于最小或最大值的工作;
  3. 可选的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:06:03