PHP环境下多条件小写匹配SQL查询结果不符问题求助
修正SQL WHERE子句逻辑,获取目标客户指定日期数据
我发现你的问题出在WHERE子句的逻辑运算符优先级上!SQL里AND的优先级比OR高,所以你原来的条件实际会被解析成:
(DATE_FORMAT(...) = '2017-09' AND lower(customer) LIKE "%ota%") OR LOWER(customer) LIKE "%alkaip%" OR LOWER(customer) LIKE "%alve%" OR LOWER(customer) LIKE "%antako%"
这就导致那些不符合2017年9月日期条件的alkaip、alve、antako客户数据也被查询出来,而你想要的应该是同时满足日期条件+客户属于指定列表的结果,对吧?
修正后的SQL代码
SELECT DATE(date_time) dates, SUM(duration/60), customer, provider FROM cdr_sbc_2017 WHERE DATE_FORMAT(CONVERT_TZ(disconnect_time,'+07:00','+07:00'),'%Y-%m') = '2017-09' AND (LOWER(customer) LIKE "%ota%" OR LOWER(customer) LIKE "%alkaip%" OR LOWER(customer) LIKE "%alve%" OR LOWER(customer) LIKE "%antako%") GROUP BY customer;
关键修正点
- 把所有客户匹配的
OR条件用括号包裹起来,让这部分逻辑先执行,判断客户是否属于目标列表 - 再用
AND和日期条件关联,确保只有同时满足日期和客户条件的数据才会被筛选
另外提个小优化:你写的CONVERT_TZ(disconnect_time,'+07:00','+07:00')其实等于直接用disconnect_time(时区转换前后是同一个时区),可以简化成DATE_FORMAT(disconnect_time,'%Y-%m') = '2017-09',代码会更简洁。
内容的提问来源于stack exchange,提问作者Ambang Rizky
相关产品推荐
相关产品推荐

