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:
- 我能想到的最古老的方法之一是将
+0
添加到查询中的列。我没有找到关于此的任何官方文档,但我认为这样做会将查询中的数据值更改为数字:
SELECT * FROM table1
WHERE alc+0 BETWEEN '7' AND '13';
- 这可能与上面相同,只是我不确定这是否是特定于版本的。事实证明,在我的测试中,如果您没有将搜索到的值括在引号中,您将得到的结果就像数据是数字一样:
SELECT * FROM table1
WHERE alc BETWEEN 7 AND 13;
- 这需要更改列数据类型,但之后任何对搜索值带引号或不带引号的查询都应该有效:
ALTER TABLE table1 CHANGE alc alc INT;
我希望这是真的,问题确实与列数据类型有关。据我所知,这是我遇到过的最接近你的情况。
我有过滤器代码。在我将新产品添加到我的数据库之前,它运行良好。我发现了问题,但不知道该怎么做。
我的过滤器中有参数“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:
- 我能想到的最古老的方法之一是将
+0
添加到查询中的列。我没有找到关于此的任何官方文档,但我认为这样做会将查询中的数据值更改为数字:
SELECT * FROM table1
WHERE alc+0 BETWEEN '7' AND '13';
- 这可能与上面相同,只是我不确定这是否是特定于版本的。事实证明,在我的测试中,如果您没有将搜索到的值括在引号中,您将得到的结果就像数据是数字一样:
SELECT * FROM table1
WHERE alc BETWEEN 7 AND 13;
- 这需要更改列数据类型,但之后任何对搜索值带引号或不带引号的查询都应该有效:
ALTER TABLE table1 CHANGE alc alc INT;
我希望这是真的,问题确实与列数据类型有关。据我所知,这是我遇到过的最接近你的情况。