SQL中AND与OR运算符行为不符合预期的原因排查
SQL查询条件逻辑异常原因分析
你执行的SQL查询如下:
SELECT `user_organisation`.*, `users`.`full_name`, `users`.`email`, `users`.`avatar` FROM `user_organisation` INNER JOIN `users` ON `users`.`id` = `user_organisation`.`user_id` WHERE `users`.`full_name` LIKE '%test%' OR `users`.`email` LIKE '%test%' AND `user_organisation`.`organisation_id` = 111
查询结果包含了user_organisation.organisation_id等于111和222的记录,但你期望的是筛选出users.full_name或users.email包含“test”且user_organisation.organisation_id为111的记录。
异常原因
这是SQL运算符优先级导致的问题:
- 在SQL语法中,
AND的优先级高于OR,所以你的WHERE子句实际执行逻辑被解析为:users.full_name LIKE '%test%' OR (users.email LIKE '%test%' AND user_organisation.organisation_id = 111) - 也就是说,只要用户的
full_name包含“test”,无论其所属组织ID是多少,都会被纳入结果集,这就导致了organisation_id为222的记录被错误筛选出来。
修正方案
给OR连接的两个条件加上括号,让它们作为一个整体与AND条件结合,修正后的WHERE子句如下:
WHERE (users.full_name LIKE '%test%' OR users.email LIKE '%test%') AND user_organisation.organisation_id = 111
这样会先判断用户的姓名或邮箱是否包含“test”,再校验组织ID是否为111,完全符合你的预期。
内容的提问来源于stack exchange,提问作者M. Çağlar TUFAN
相关产品推荐
相关产品推荐

