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

如何查询同时拥有指定多份证书的员工信息

如何查询同时持有BSCS和MSCS证书的员工列表

现有三张表:users(员工信息表)、employee_certificates(员工-证书关联表,存储员工ID和证书ID对应关系)、certificates(证书表,BSCS对应ID9,MSCS对应ID10)。要筛选同时拥有这两份证书的员工,之前的两种写法都达不到要求:

  • WHERE c.id = 9 AND c.id=10:单条记录不可能同时对应两个证书ID,自然查不到结果
  • WHERE c.id IN (9,10):会把只要持有其中一份证书的员工都捞出来(比如206、207、208),不符合“同时持有”的需求

给你几个靠谱的解决写法:

方法1:分组统计法(最直观)

先过滤出目标证书的关联记录,按员工分组后统计证书数量,只保留数量为2的员工,再关联users表获取详细信息:

SELECT u.*
FROM users u
JOIN employee_certificates ec ON u.id = ec.user_id
JOIN certificates c ON ec.certificate_id = c.id
WHERE c.id IN (9, 10)
GROUP BY u.id
HAVING COUNT(DISTINCT c.id) = 2;

加DISTINCT是为了避免同一份证书被重复录入的情况,确保统计的是不同证书的数量。

方法2:自连接法(效率较高)

把员工-证书关联表连两次,分别匹配两个证书ID,只有同时满足两个条件的员工才会被选中:

SELECT u.*
FROM users u
JOIN employee_certificates ec1 ON u.id = ec1.user_id AND ec1.certificate_id = 9
JOIN employee_certificates ec2 ON u.id = ec2.user_id AND ec2.certificate_id = 10;

这种写法不需要分组,数据量大的时候性能表现更好。

方法3:EXISTS子查询法(逻辑清晰)

用两个子查询分别验证员工是否拥有两份证书,同时满足条件才返回结果:

SELECT u.*
FROM users u
WHERE EXISTS (
    SELECT 1 FROM employee_certificates ec 
    WHERE ec.user_id = u.id AND ec.certificate_id = 9
)
AND EXISTS (
    SELECT 1 FROM employee_certificates ec 
    WHERE ec.user_id = u.id AND ec.certificate_id = 10
);

逻辑一目了然,读起来容易理解,后续维护也方便。

这三种写法都能准确返回同时持有两份证书的员工(比如你需要的user_id=206的记录)。

内容的提问来源于stack exchange,提问作者Fredericka Hartman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:27:09