问题描述:
查询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 '%水果%')
正确查询结果: