记一次MySQL关于and和or的优先级的问题

最近在做毕设的时候 碰到了一个问题,需求是在指定一个字段为确定值的情况下,对其他所有字段进行模糊查询,具体SQL如下

1
2
select *,ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) AS age from household where household_name like CONCAT('%',#{query},'%') 
or telephone like CONCAT('%',#{query},'%') or gender like CONCAT('%',#{query},'%') or address like CONCAT('%',#{query},'%') or birthday like binary CONCAT('%',#{query},'%') and is_f = '是'

这条sql语句执行后,预期的结果是查出字段is_f为‘是’的所有行,但是执行后实际的结果为is_f为否的行也被查出来了,这并不符合预期,查谷歌后发现
and的优先级比or要高,所以这么写,本SQL语句的意思就变成了 查出is_f为是,并且生日匹配查询字段,或者其他字段匹配的结果
此处的解决办法是在where后和and前加括号,具体SQL如下,经试验结果符合预期

1
2
select *,ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) AS age from household where (household_name like CONCAT('%',#{query},'%') 
or telephone like CONCAT('%',#{query},'%') or gender like CONCAT('%',#{query},'%') or address like CONCAT('%',#{query},'%') or birthday like binary CONCAT('%',#{query},'%')) and is_f = '是'