具有多个值的 FIND_IN_SET

Posted

技术标签:

【中文标题】具有多个值的 FIND_IN_SET【英文标题】:FIND_IN_SET with multiple value 【发布时间】:2021-12-31 14:46:12 【问题描述】:

我想从数据库字段中搜索多个值。以下是我的查询。

SELECT * FROM `tablename` 
WHERE FIND_IN_SET('12,13,15,15',category_id) 

我如何搜索它对我不起作用。

【问题讨论】:

你需要把你的论点换成FIND_IN_SET() 在发帖之前我很想尝试一下 我认为您应该将查询修改为SELECT * FROM tablename WHERE FIND_IN_SET('category_id','12,13,15,15') 我试图解决一个类似的问题,偶然发现了这个***.com/questions/5015403/… 的答案。 【参考方案1】:

FIND_IN_SET 不是解决方案。 尝试使用正则表达式:

SELECT * FROM `tablename` 
WHERE CONCAT(',', `category_id`, ',') REGEXP ',(12|13|15),';

但即使它不那么漂亮,出于性能原因,最好使用 LIKE :

SELECT * FROM `tablename` 
WHERE CONCAT(',', `category_id`, ',') LIKE '%,12,%' OR CONCAT(',', `category_id`, ',') LIKE '%,13,%' OR CONCAT(',', `category_id`, ',') LIKE '%,15,%';

【讨论】:

【参考方案2】:

FIND_IN_SET() 只能用于搜索逗号分隔列表中的单个值,它不适用于两个列表。

您需要为每个值单独调用它。

SELECT * FROM tablename
WHERE FIND_IN_SET('12', category_id) OR FIND_IN_SET('13', category_id) OR FIND_IN_SET('15', category_id)

如果你规范化你的架构而不是使用逗号分隔的列表会更好。如果您使用类别 ID 创建一个多对多表,您可以这样做:

SELECT t1.*
FROM tablename AS t1
JOIN item_categories AS c ON t1.id = c.table_id
WHERE c.category_id IN (12, 13, 15)

【讨论】:

我认为这是解决这个问题的正确方法,因为我们知道 find_in_set 只搜索一个值。

以上是关于具有多个值的 FIND_IN_SET的主要内容,如果未能解决你的问题,请参考以下文章

聚合具有两个或多个具有相同值的列的行

如何解析具有多个值的 json?

选择具有多个重复字段值的行

Django在具有多个值的多个字段中搜索

在 R 中检测具有多个观察值的行

每个 'when' 块中具有多个值的 case 语句