Mysql 逗号分隔搜索

Mysql 逗号分隔搜索,mysql,Mysql,我想获取兴趣=IN6330、IN8408的记录。URL是example.com?interests=IN6330,IN8408。尝试使用以下查询,但一次只能使用一个参数。逗号分隔的值可以是单个或多个 SELECT * FROM `interests` WHERE FIND_IN_SET('IN8408',interests) 也许是因为你的需要。 以身作则 从IN6330、IN8408中的利息中选择* 是参考。叹气。这就是人们抱怨正常化的原因。SQL被悲观化,而不是被优化为在逗号分隔值的字符串

我想获取兴趣=IN6330、IN8408的记录。URL是example.com?interests=IN6330,IN8408。尝试使用以下查询,但一次只能使用一个参数。逗号分隔的值可以是单个或多个

SELECT * FROM `interests` WHERE FIND_IN_SET('IN8408',interests)
也许是因为你的需要。 以身作则

从IN6330、IN8408中的利息中选择*


是参考。

叹气。这就是人们抱怨正常化的原因。SQL被悲观化,而不是被优化为在逗号分隔值的字符串中搜索匹配项

成功的最佳途径:通过为兴趣创建一个新表来规范化数据库,该表可以有多个项目,每个项目都在自己的行中。在实体关系术语中,您需要一个与其父项具有多对一关系的兴趣实体。然后是对表单的查询

 SELECT item.something, item.another, interests.interest
   FROM item
   JOIN interests on item.interest_id = interests.interest_id
  WHERE interests.interest IN ('IN6330','IN8408')
他会工作,而且工作效率很高

如果必须在表中保留这些逗号分隔的值,则需要一种更费劲、更详细的方法来执行类似in的搜索

像这样的东西可能对你有用

 SELECT * FROM interests WHERE FIND_IN_SET('IN6330',interests)
 UNION
 SELECT * FROM interests WHERE FIND_IN_SET('IN8408',interests)
但正如你所看到的那样,这是令人讨厌的:令人讨厌的是,在你之后开发你的软件的人会诅咒你的名字


正常化

首先,将逗号分隔的值替换为|


在你的查询中使用'IN'子句这每天都会出现,试试谷歌mysql搜索逗号分隔字符串。它只返回6330个值
$search="IN6330,IN8408";
$result = preg_replace('/[ ,]+/', '|', trim($search));
SELECT * FROM `interests` WHERE `interests` REGEXP $result