WordPress 查询,meta_query,比较 BETWEEN,无结果

WordPress query, meta_query, compare BETWEEN, no results

我有过滤器代码。在我将新产品添加到我的数据库之前,它运行良好。我发现了问题,但不知道该怎么做。

我的过滤器中有参数“alc_min”和“alc_max”。我从抓取所有产品中得到这些。发送此过滤器后,我触发此代码:

$meta_query = array();
$b = "alc_min";
$c = "alc_max";
if (isset ( $data [$b] ) && isset ( $data [$c] )) {
    $compare = "BETWEEN";
    $a = array (
            'key' => "alc",
            'value' => array (
                    $data [$b],
                    $data [$c]
            ),
            'compare' => $compare
    );
    array_push ( $meta_query, $a );
}

            $items = new WP_Query ( array (
                    'post_type' => $type,
                    'posts_per_page' => $posts_per_page,
                    'order' => $order,
                    'meta_key' => $orderkey,
                    'orderby' => $orderby,
                    'post_status' => 'publish',
                    'meta_query' => $meta_query,
                    'paged' => $paged
            ) );

到目前为止,它运行良好。不,我添加了“alc”<10 的新产品,我发现如果我有“alc_min”和“alc_max”<10 或 >10,就可以了。但是,如果“alc_min”<10 且“alc_max”>10,我根本得不到任何结果。

有人知道要检查或修复什么吗?

经过澄清,我怀疑 selecting "alc_min" = 7 and "alc_max" = 13 没有产生任何结果的原因是列数据类型。考虑这个例子:

CREATE TABLE table1 (
alc VARCHAR(50));

INSERT INTO table1 VALUES 
('7'),
('9'),
('11'),
('13');

上面的 table 是使用 alc 列数据类型创建的 VARCHAR 而不是 INTEGER (或数字数据类型)。我测试了 运行ning 以下任一查询:

SELECT * FROM table1 WHERE alc BETWEEN '7' AND '9';
SELECT * FROM table1 WHERE alc BETWEEN '11' AND '13';

会return预期的结果。但是,使用此查询:

SELECT * FROM table1 WHERE alc BETWEEN '7' AND '13';

没有结果。这是因为值被视为字符串而不是数字,当发生这种情况时,1 总是小于 7。请参阅下面,您 运行 select 对上述数据集进行排序查询时发生了什么:

SELECT * FROM table1 ORDER BY alc;

+-----+
| alc |
+-----+
|  11 |
|  13 |
|  7  |
|  9  |
+-----+

如您所见,由于数据被视为字符串(根据列数据类型),因此您可以按字母顺序想象如下:

+-----+--------------+
| alc | alphabetical |
+-----+--------------+
|  11 |      AA      |
|  13 |      AC      |
|  7  |       G      |
|  9  |       I      |
+-----+--------------+

所以,BETWEEN '7' AND '13'的条件就变成了BETWEEN 'G' AND 'AC';这真的没有意义。如果您更改为 BETWEEN '11' AND '9',您将得到正确的结果,但这会使查询更加混乱并且根本没有意义。

现在,我发现至少有 3 个 workaround/solution:

  1. 我能想到的最古老的方法之一是将 +0 添加到查询中的列。我没有找到关于此的任何官方文档,但我认为这样做会将查询中的数据值更改为数字:
         SELECT * FROM table1 
            WHERE alc+0 BETWEEN '7' AND '13';
  1. 这可能与上面相同,只是我不确定这是否是特定于版本的。事实证明,在我的测试中,如果您没有将搜索到的值括在引号中,您将得到的结果就像数据是数字一样:
         SELECT * FROM table1 
            WHERE alc BETWEEN 7 AND 13;
  1. 这需要更改列数据类型,但之后任何对搜索值带引号或不带引号的查询都应该有效:
         ALTER TABLE table1 CHANGE alc alc INT;

我希望这是真的,问题确实与列数据类型有关。据我所知,这是我遇到过的最接近你的情况。

Here's a fiddle for reference