如何简化该MySQL查询?筛选未分配至指定组织的子用户(含特殊场景)
简化你的SQL查询方案
嘿,我来帮你优化这条查询语句!先明确你的核心需求:
- 从
user表中筛选出组织ID为1、状态启用的子用户 - 排除那些已经被分配到组织ID为2的子用户,但如果该子用户属于当前用户(ID=19),则依然保留
原查询逻辑是对的,但确实可以通过更简洁的写法提升可读性和性能,下面给你两种优化方案:
方案一:使用LEFT JOIN替代NOT IN
SELECT u.userId, u.firstName, u.lastName, u.username, u2.services_user_id FROM user u LEFT JOIN user u2 ON u.userId = u2.services_user_id -- 左连接到"分配到组织2且不属于当前用户19"的记录 LEFT JOIN user assigned_org2 ON u.userId = assigned_org2.services_user_id AND assigned_org2.organization_id = 2 AND assigned_org2.services_user_id <> 19 WHERE u.enabled = 1 AND u.organization_id = 1 -- 只保留没有匹配到上述连接的记录(即要么没分配到组织2,要么分配了但属于当前用户19) AND assigned_org2.services_user_id IS NULL;
方案二:使用NOT EXISTS(更直观)
NOT EXISTS在逻辑表达上更贴近你的需求,而且很多数据库对它的优化效果更好:
SELECT u.userId, u.firstName, u.lastName, u.username, u2.services_user_id FROM user u LEFT JOIN user u2 ON u.userId = u2.services_user_id WHERE u.enabled = 1 AND u.organization_id = 1 -- 核心逻辑:不存在"该子用户被分配到组织2且不属于当前用户19"的记录 AND NOT EXISTS ( SELECT 1 FROM user WHERE services_user_id = u.userId AND organization_id = 2 AND services_user_id <> 19 );
为什么这两种写法更优?
- 可读性更强:直接把排除逻辑写在连接/子查询里,和业务需求对应更紧密
- 性能更稳定:
NOT IN在遇到NULL值时容易出现意外结果(你原查询里特意加了services_user_id IS NOT NULL),而LEFT JOIN和NOT EXISTS天然避免了这个问题 - 代码更简洁:去掉了冗余的条件判断,逻辑更紧凑
内容的提问来源于stack exchange,提问作者mydoglixu
相关产品推荐
相关产品推荐

