MySQL:如何查询未关联skl_id=1技能记录的人员信息?
找出未掌握指定技能的人员解决方案
嘿,这需求太常见了!要找出所有没有skl_id为1的技能记录的人员信息,我给你分享几种实用的SQL写法,你可以根据自己的数据库情况选合适的:
方法一:使用NOT EXISTS(推荐,逻辑清晰且高效)
这种方式是对每个人员做存在性检查,只要他没有对应技能ID=1的记录就被选中,大多数数据库对这种写法的优化都很好:
SELECT p.prs_id, p.name FROM mod_personnel p WHERE NOT EXISTS ( -- 检查当前人员是否有skl_id=1的技能记录 SELECT 1 FROM mod_skills s WHERE s.prs_id = p.prs_id AND s.skl_id = 1 );
方法二:LEFT JOIN + IS NULL
通过左连接把人员表和目标技能记录关联,没有匹配到的人员会返回NULL值,我们只要筛选这些NULL的行就行:
SELECT p.prs_id, p.name FROM mod_personnel p LEFT JOIN mod_skills s -- 关联条件限定为skl_id=1的技能 ON p.prs_id = s.prs_id AND s.skl_id = 1 -- 没有匹配到对应技能的人员,s.prs_id会是NULL WHERE s.prs_id IS NULL;
方法三:使用NOT IN(需注意特殊情况)
这种写法看起来简洁,但要小心如果子查询里的prs_id存在NULL值的话,整个查询会返回空结果,所以使用前要确保子查询没有NULL:
SELECT prs_id, name FROM mod_personnel WHERE prs_id NOT IN ( -- 先拿到所有有skl_id=1技能的人员ID SELECT prs_id FROM mod_skills WHERE skl_id = 1 -- 可选:如果表中可能有NULL,加上这个排除 AND prs_id IS NOT NULL );
内容的提问来源于stack exchange,提问作者Chris Harmon
相关产品推荐
相关产品推荐

