【问题标题】:SQL Select statement to get all records that contains one or more values in a stringSQL Select 语句获取字符串中包含一个或多个值的所有记录
【发布时间】:2021-07-22 11:36:07
【问题描述】:

我被这个问题困住了:

我在wp_postmeta 中制作了3 个自定义meta_key。现在我必须从我提供的字符串中选择包含在meta_value 列中的所有记录,一个或多个单词。

这是我写的 SQL,但它没有返回任何结果,即使我有一个匹配 REGEX 的单词。

 SELECT post_id FROM wp_postmeta WHERE
 meta_key = 'packaging_attributes'
 AND
 meta_key = 'properties_attributes'
 AND
 meta_key = 'tech_functions_attributes'
 AND
 meta_value REGEXP 'chased-floor|chased-wall-plasterboard|alarm-en|0-22|0-220-75|15|25'

这是来自 db: 的截图

正如你在第 1008 行中看到的那样,我有 chased-wall-plasterboard,它应该与上面的选择匹配,然后给我返回 39 结果。但它不起作用。

如果我删除三个 meta_key = column_name,我将获得大量结果,但不会获得 39

【问题讨论】:

  • 你应该使用 OR 而不是 AND。

标签: mysql sql wordpress


【解决方案1】:

我假设您真正想要的是在当前WHERE 子句中包含所有 3 个元值的记录的元帖子。如果是这样,那么聚合是一种方法:

SELECT post_id
FROM wp_postmeta
WHERE meta_key IN ('packaging_attributes', 'properties_attributes', 'tech_functions_attributes') AND
      meta_value REGEXP 'chased-floor|chased-wall-plasterboard|alarm-en|0-22|0-220-75|15|25'
GROUP BY post_id
HAVING COUNT(DISTINCT meta_key) = 3;

不清楚meta_value的限制是否真的属于那里。

【讨论】:

  • 谢谢蒂姆,它就像一个魅力。我只需要删除 HAVING COUNT(...),它通过给我返回 id 39 来工作
  • @d0t_m ... 但删除 HAVING 子句会更改查询。您真正想看到的确切输出是什么?
  • 例如,如果我有 30 种产品包含 ('packaging_attributes', 'properties_attributes', 'tech_functions_attributes') 至少一个词列在 REGEX 中,我希望得到一个 ID 列表.因此,如果在这 30 个中,其中有 22 个进入 meta_value 正则表达式 chased-wall-plasterboard,我想要这 22 个 ID,省略其他 ID。
【解决方案2】:

您应该使用 OR 操作来收集所有 4 行。

 SELECT post_id FROM wp_postmeta WHERE
 meta_key = 'packaging_attributes'
 OR
 meta_key = 'properties_attributes'
 OR
 meta_key = 'tech_functions_attributes'
 OR
 meta_value REGEXP 'chased-floor|chased-wall-plasterboard|alarm-en|0-22|0-220-75|15|25'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多