元键值区间匹配异常:meta_query未返回预期CPT记录求助
需求与解决方案
现有CPT记录
| Name | Size From | Size To |
|---|---|---|
| Demo 1 | 900 | 6000 |
| Demo 2 | 5000 | 6000 |
| Demo 3 | 7500 | 12000 |
| Demo 4 | 2500 | 7500 |
| Demo 5 | 9000 | 12000 |
原代码问题
原使用的meta_query代码如下:
$meta_query = array( 'relation' => 'OR', array( array( 'key' => '_size', 'value' => array(1000, 5000), 'type' => 'decimal(10, 2)', 'compare' => 'between' ), array( 'key' => '_size_to', 'value' => array(1000, 5000), 'type' => 'decimal(10, 2)', 'compare' => 'between' ), ), );
该代码生成的SQL逻辑为:
SELECT * FROM test WHERE _size BETWEEN (1000 AND 5000) OR _size_to BETWEEN (1000 AND 5000)
但实际需要实现的逻辑是判断1000或5000落在_size与_size_to的区间内,对应SQL为:
SELECT * FROM test WHERE 1000 BETWEEN (_size AND _size_to) OR 5000 BETWEEN (_size AND _size_to)
预期输出结果:
| Name | Size From | Size To |
|---|---|---|
| Demo 1 | 900 | 6000 |
| Demo 2 | 5000 | 6000 |
| Demo 4 | 2500 | 7500 |
最优解决方案
由于WordPress的meta_query中BETWEEN默认是字段值落在给定的区间内,无法直接实现“目标值落在两个字段的区间内”的逻辑,因此需要拆解为两组AND条件,再用OR连接:
$meta_query = array( 'relation' => 'OR', // 匹配1000处于_size和_size_to之间的记录 array( 'relation' => 'AND', array( 'key' => '_size', 'value' => 1000, 'type' => 'decimal(10, 2)', 'compare' => '<=' ), array( 'key' => '_size_to', 'value' => 1000, 'type' => 'decimal(10, 2)', 'compare' => '>=' ) ), // 匹配5000处于_size和_size_to之间的记录 array( 'relation' => 'AND', array( 'key' => '_size', 'value' => 5000, 'type' => 'decimal(10, 2)', 'compare' => '<=' ), array( 'key' => '_size_to', 'value' => 5000, 'type' => 'decimal(10, 2)', 'compare' => '>=' ) ) );
逻辑说明
- 每组
AND条件对应一个目标值的判断:_size <= 目标值且_size_to >= 目标值,等价于目标值落在两个字段的区间内 - 两组条件通过
OR连接,实现“1000或5000在区间内”的需求 - 保留
decimal(10, 2)类型确保数值比较的精度
内容的提问来源于stack exchange,提问作者Shital Pawar
相关产品推荐
相关产品推荐

