具有多个值的 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的主要内容,如果未能解决你的问题,请参考以下文章