mysql like 查询 or 关联 查询出数据错误

线上环境测试时候,测试提了个bug 如下

SELECT
	userid,
	responsibility,
	autograph,
	dtno,
	origanize
FROM
	T_AMS_RECORDFILE 
WHERE
	origanizeIN ( '局领导1', '局领导2', '局领导3', '局领导4' ) 
	AND userid = '1' 
	AND responsibility LIKE '%2%' 
	OR autograph LIKE '%2%' 
	OR dtno LIKE '%2%' 

情景还原 :
数据表里只有40多条数据在查询时有80多条数据
查询条件:输入条件统一做用于 3个字段上

解决方法:

SELECT
	userid,
	responsibility,
	autograph,
	dtno,
	origanize
FROM
	T_AMS_RECORDFILE 
WHERE
	origanizeIN ( '局领导1', '局领导2', '局领导3', '局领导4' ) 
	AND userid = '1' 
	AND (responsibility LIKE '2%' 
	OR autograph LIKE '2%' 
	OR dtno LIKE '2%') 

其中like 左边通配符去掉了,防止索引失效 !

既然解决了那总要知道是什么原因导致

我建议在两个逻辑标准集(更重要的是OR部分)周围添加括号。事实上,你完全信任行动的顺序,我不认为它决定了你想要的方式。括号应该可以做到

为什么会这样呢?
原因在于计算的次序。SQL(像多数语言一样)在处理 OR 操作符前,优先处理 AND 操作符。当 SQL 看到上述 WHERE 子句时,由于 AND 在计算次序中优先级更高,操作符被错误地组合了。

任何时候使用具有 AND 和 OR 操作符的 WHERE 子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认计算次序,即使它确实是你想要的东西也是如此。使用圆括号没有什么坏处,它能消除歧义。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值