MySQL查询WHERE条件优先级问题求助:需优先匹配class_id筛选
问题分析与解决
原查询存在两个核心问题:
- 逻辑运算符优先级错误:AND优先级高于OR,导致实际执行逻辑为
(class_id匹配 AND stime在时间区间) OR edate在时间区间,会包含class_id不匹配但edate符合的数据,不符合「必须优先满足class_id条件」的需求。 - SQL占位符与参数顺序不匹配:
prepare的参数顺序和SQL里的%s位置对应错误,会导致查询参数赋值错位。
修正后的查询代码
$wpdb->get_results($wpdb->prepare( "SELECT `st`.id, `st`.sub_name, `st`.stime, `st`.edate FROM {$_tables['subject']} AS st WHERE `st`.class_id IN ('%s') AND ((`stime` BETWEEN '%s' AND '%s') OR (`edate` BETWEEN '%s' AND '%s'));", [$value, $start, $end, $start, $end] ));
关键说明
- 用括号包裹两个时间条件,确保
class_id匹配与(stime符合 OR edate符合)为AND关系,保证所有返回数据都满足class_id要求,再筛选时间范围。 - 调整
prepare参数顺序,让$value对应第一个%s(class_id条件),后续$start和$end依次匹配时间区间占位符,避免参数错位。
内容的提问来源于stack exchange,提问作者Solar Confinement
相关产品推荐
相关产品推荐

