SQL Select 语句获取字符串中包含一个或多个值的所有记录
Posted
技术标签:
【中文标题】SQL Select 语句获取字符串中包含一个或多个值的所有记录【英文标题】:SQL Select statement to get all records that contains one or more values in a string 【发布时间】: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。 【参考方案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'
【讨论】:
以上是关于SQL Select 语句获取字符串中包含一个或多个值的所有记录的主要内容,如果未能解决你的问题,请参考以下文章
Oracle环境,求一个sql语句,如何查询某字段(bz)中包含三个英文字母的连写记录?
MySQL - View 的 SELECT 在 FROM 子句中包含一个子查询
如何在 Java 中的 Prepared Select 语句中包含参数? [复制]