【问题标题】:WordPress query, meta_query, compare BETWEEN, no resultsWordPress 查询,meta_query,比较 BETWEEN,没有结果
【发布时间】:2021-11-12 20:08:50
【问题描述】:

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

我的过滤器中有参数“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”10,我根本得不到任何结果。

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

【问题讨论】:

  • 所以举个真实的例子:查询适用于 5,9 和 17,18 但不适用于 5,15 (min,max)?
  • 是的,就是这样。我有这个真实网站(电子商店)的查询几个月没有问题,但是我在下面添加了带有“alc”的产品 10,我发现了这个问题。
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: mysql wordpress between meta-query


【解决方案1】:

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

CREATE TABLE table1 (
alc VARCHAR(50));

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

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

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

将返回预期的结果。但是,使用此查询:

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

没有结果。这是因为这些值被视为字符串而不是数字,当这种情况发生时,1 总是小于7。看看下面你在上面的数据集上使用 order by 运行 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 种解决方法/解决方案:

  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

【讨论】:

  • 我想我们没有互相理解,也许我写得不清楚。我有属性“alc”的滑块过滤器。例如,我有五种产品,“alc”为 7、8、11、13、15。如果我有“alc_min”= 7 和“alc_max”= 9 的过滤器,它会返回 2 个结果(7 和 8)并且很好。如果“alc_min” = 10 和“alc_max” = 13,它也会给我 2 个结果(11 和 13)。但是如果“alc_min” = 7 和“alc_max” = 13,我预计会有 4 个结果(7、8、11、13),但我什么也得不到。我刚刚发现,如果过滤器中的“alc_min”低于 10,而“alc_max”高于 10,则它已损坏,我不知道为什么。
  • 对不起,我没有注意到有回复。我可以得到你正在做的表结构和原始 MySQL 查询吗?您可以运行SHOW CREATE TABLE table_namepost the result into your question。我有一种预感,这可能是由列数据类型引起的,但我需要知道查看表结构和原始查询以确认它。
  • 感谢您的编辑。也许就是这样,但现在我需要找到功能解决方案。我不直接建立查询,也不能更改数据库中的数据类型。所有参数的数据都以元键/值格式存储,因此是“长文本”。我可以将输入数据转换为浮点值,但这无济于事。如果我在查询中更改最小值和最大值,它也会给我带来不好的结果(只有具有最小值和最大值的项目)。我现在尝试了更多的东西,但我没有找到解决方案。但我认为这就是方法!谢谢。
  • 好吧,最后感谢您的建议,我找到了问题和解决方案。当我专注于解决数据集时,我发现 WP Query 中有两种类型。我使用“数字”,但正确的是“十进制”。现在它将浮点数作为浮点数并可以对它们进行比较,现在它似乎正在工作。非常感谢!
  • 你已经找到了方法,重点。我刚刚为您的建议找到了解决方案。所以你的答案是正确的,但我不能像它在 WordPress 中那样使用它。再次感谢您的耐心和帮助:)
猜你喜欢
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
相关资源
最近更新 更多