You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

元键值区间匹配异常:meta_query未返回预期CPT记录求助

需求与解决方案

现有CPT记录

NameSize FromSize To
Demo 19006000
Demo 250006000
Demo 3750012000
Demo 425007500
Demo 5900012000

原代码问题

原使用的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)

预期输出结果:

NameSize FromSize To
Demo 19006000
Demo 250006000
Demo 425007500

最优解决方案

由于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:20:10