SQL查询中日期与折扣类型过滤条件不生效问题咨询
问题排查与解决方案
嘿,我一眼就发现你的SQL过滤失效的问题所在了——WHERE子句的逻辑运算符使用错误,导致条件完全不符合你的预期。
问题根源分析
你的原SQL里的OR写法犯了两个关键错误:
- 逻辑优先级问题:SQL中
AND的优先级远高于OR,所以你的条件会被数据库解析成这样:
而单独的数字(比如(evenementen.evSpeeldatum >= '2018-01-24' AND tickets.tiPrijstype = 2) OR 3 OR 4 OR 5 OR 6 OR 66 OR 673)在布尔判断中会被视为TRUE(非零值都等价于真),这就导致整个WHERE条件几乎永远为真,自然起不到过滤作用。 - OR的语法错误:你写
OR 3的方式是错的,正确的写法应该是OR tickets.tiPrijstype = 3——你需要明确判断字段值,而不是直接放一个数字。
修正后的两种写法
写法1:使用IN子句(推荐,更简洁易读)
IN子句专门用来判断字段值是否在指定列表中,完美匹配你的需求:
SELECT * FROM tickets JOIN evenementen ON tickets.fk_tiEvenementID = evenementen.idEvenement WHERE evenementen.evSpeeldatum >= '2018-01-24' AND tickets.tiPrijstype IN (2, 3, 4, 5, 6, 66, 67);
写法2:用括号包裹OR条件(明确逻辑分组)
如果坚持用OR,必须用括号把所有折扣类型的判断括起来,确保它和日期条件是同时满足的关系:
SELECT * FROM tickets JOIN evenementen ON tickets.fk_tiEvenementID = evenementen.idEvenement WHERE evenementen.evSpeeldatum >= '2018-01-24' AND (tickets.tiPrijstype = 2 OR tickets.tiPrijstype = 3 OR tickets.tiPrijstype = 4 OR tickets.tiPrijstype = 5 OR tickets.tiPrijstype = 6 OR tickets.tiPrijstype = 66 OR tickets.tiPrijstype = 67);
这两种写法都会让数据库正确执行你的过滤逻辑:只有活动日期在2018-01-24及之后,且折扣类型是你指定的那些值的记录,才会被查询出来。
内容的提问来源于stack exchange,提问作者nemja
相关产品推荐
相关产品推荐

