Mysql 中 OR 和 AND 优先级问题

问题描述:

查询keyword,product_describe,product_name属性里面包含关键字,并且product_kind = 1,product_status = 2 , jg.is_delete = 0的所有记录

一开始没有添加查询列product_kind,product_status,咦....? 发现is_delete查询结果不正确,is_delete = 0 这个条件好像没有起作用

select jg.id as goodsId,product_name as goodsName,jm.name as merchantName,product_status,
jg.product_kind,jg.store_id,jg.is_delete
from jdy_goods jg
left outer join jdy_merchant jm on jg.store_id = jm.id
where jg.product_kind = 1 and jg.is_delete = 0
and keyword like '%水果%' or product_describe like '%水果%'
or product_name like '%水果%' and jg.product_status = 2

执行结果:

把is_delete= 0这个条件放在后面,哎.....? 好像起作用了

可怕的但是,剧情反转,当我把product_kind,product_status查询字段加上后,结果又出现了问题

select jg.id as goodsId,product_name as goodsName,jm.name as merchantName,product_status,
jg.product_kind,jg.store_id,jg.is_delete
from jdy_goods jg
left outer join jdy_merchant jm on jg.store_id = jm.id
where jg.product_kind = 1
and keyword like '%水果%' or product_describe like '%水果%'
or product_name like '%水果%' and jg.product_status = 2 and  jg.is_delete = 0

执行结果:

我猜测应该是三个模糊查询的问题,试着把三个状态条件放在后面,what? 还是一样有问题

select jg.id as goodsId,product_name as goodsName,jm.name as merchantName,product_status,jg.product_kind,jg.store_id,jg.is_deletefrom jdy_goods jgleft outer join jdy_merchant jm on jg.store_id = jm.idwhere keyword like '%水果%' or product_describe like '%水果%'or product_name like '%水果%' and jg.product_status = 2 and jg.product_kind = 1 and jg.is_delete = 0

执行结果:

谷歌之后才发现是or 和 and 的优先级问题。优先级 and > or 

所以sql会先执行and条件再执行or条件,就出现了查询数据与预期不一致问题,若提高or的优先级可以把or条件用()括起来,如下面写法:

仿佛回到了小学时代的算术运算,哈哈

一:
select jg.id as goodsId,product_name as goodsName,jm.name as merchantName,product_status,
jg.product_kind,jg.store_id,jg.is_delete
from jdy_goods jg
left outer join jdy_merchant jm on jg.store_id = jm.id
where (keyword like '%水果%' or product_describe like '%水果%'
or product_name like '%水果%') and jg.product_kind = 1
and jg.product_status = 2 and jg.is_delete = 0

二:
select jg.id as goodsId,product_name as goodsName,jm.name as merchantName,product_status,
jg.product_kind,jg.store_id,jg.is_delete
from jdy_goods jg
left outer join jdy_merchant jm on jg.store_id = jm.id
where jg.product_kind = 1 and jg.product_status = 2 and jg.is_delete = 0
and (keyword like '%水果%' or product_describe like '%水果%'
or product_name like '%水果%')

正确查询结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值