最近项目中用到了比较复杂的查询,于是写了个sql:select * from table a where status= '1' or (status = '2' and sub_status in('a','b')) and shop = 1;需求是需要查询给定的店铺1中状态是1或者状态是2时子状态在a或者b的数据。这里涉及到一个sql语句中and和or的优先级问题,如上的查询当 status = 1时无论shop是否是1都将被查询出来,原因是and优先级大于or,那语句在执行时先判断and条件再or导致只要前条件满足后shop=1 无效,解决方案:凡事使用or的语句都需要用括号来消除歧义。上面的语句可以改为:
select * from table a where shop = 1 and (status= '1' or (status = '2' and sub_status in('a','b'))) 这样就可以达到期望查询结果。