SQL如何先通过WHERE过滤关联表数据,再对结果执行二次筛选
你原来的写法存在逻辑错误:WHERE子句的过滤是在左连接执行完成后才生效的,将user_profiles.type = 1放在WHERE中时,左连接生成的、user_profiles字段全为NULL的行就会被过滤,最终结果不符合预期。
你要的需求可以在单条SQL中实现,常用的有两种写法:
方案1:将类型过滤条件放在LEFT JOIN的ON子句中
ON子句的过滤条件会在表关联动作执行时生效,关联阶段就只会匹配type = 1的user_profiles记录,之后再过滤关联结果为空的行,就是没有创建类型为1的资料的用户:
SELECT * FROM users LEFT JOIN user_profiles ON users.id = user_profiles.user_id AND user_profiles.type = 1 WHERE user_profiles.user_id IS NULL
方案2:使用NOT EXISTS子查询
如果你不需要返回user_profiles表的字段,更推荐这种写法,语义更清晰,也不会出现多对一关联产生的重复行问题:
SELECT * FROM users WHERE NOT EXISTS ( SELECT 1 FROM user_profiles WHERE user_profiles.user_id = users.id AND user_profiles.type = 1 )
以上两种写法返回的结果完全一致,你可以根据自己的场景选择。
内容的提问来源于stack exchange,提问作者WoopWap
相关产品推荐
相关产品推荐

