如何查询同时拥有指定多份证书的员工信息
如何查询同时持有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
相关产品推荐
相关产品推荐

