MySQL为何忽略OR后的条件?房产筛选SQL语句问题咨询
解决MySQL多OR条件后过滤条件失效的问题
嗨,这问题我熟!你遇到的是SQL运算符优先级的坑——AND的优先级比OR高,所以你原来的语句其实被MySQL解析成了这样:
(tipo = 'Casas_Casa') OR (tipo = 'Departamentos_Duplex') OR (tipo = 'Casas_Chalet') OR (tipo = 'Casas Condominio') OR (tipo = 'Countries y Barrios cerrados_Casas') OR (tipo = 'PH' AND operacion = 'Alquiler')
看到没?只有最后一个tipo = 'PH'的条件会和operacion = 'Alquiler'绑定,其他的OR条件根本不会受到operacion的过滤,这就是为什么你会拿到所有符合OR条件的房源,不管operacion是什么。
修正方案1:用括号包裹所有OR条件
把所有tipo的判断用括号括起来,强制让MySQL先处理OR逻辑,再和AND条件结合:
SELECT * FROM props WHERE (tipo = 'Casas_Casa' OR tipo = 'Departamentos_Duplex' OR tipo = 'Casas_Chalet' OR tipo = 'Casas Condominio' OR tipo = 'Countries y Barrios cerrados_Casas' OR tipo = 'PH') AND operacion = 'Alquiler' ORDER BY modif DESC
更优雅的方案2:用IN替代多个OR
当你需要判断某个字段是否等于多个值时,用IN语句比一堆OR要简洁得多,可读性和维护性都更好:
SELECT * FROM props WHERE tipo IN ('Casas_Casa', 'Departamentos_Duplex', 'Casas_Chalet', 'Casas Condominio', 'Countries y Barrios cerrados_Casas', 'PH') AND operacion = 'Alquiler' ORDER BY modif DESC
以后要新增或修改tipo的筛选值,直接在IN的括号里调整就行,不用改一堆OR,方便很多。
这样修改后,MySQL就会先筛选出符合指定tipo的房源,再从中过滤出operacion为'Alquiler'的结果,排序功能也会正常生效啦。
内容的提问来源于stack exchange,提问作者Isidoro Barrera
相关产品推荐
相关产品推荐

