逗号分隔搜索

时间:2017-10-24 11:44:09

标签: mysql

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

SELECT * FROM `interests` WHERE FIND_IN_SET('IN8408',interests)

enter image description here

3 个答案:

答案 0 :(得分:1)

叹息。这就是人们抱怨规范化的原因。 SQL在搜索逗号分隔值字符串中的匹配项时被认为是优化的(与优化相反)。

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

 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)

但正如你可以看到的那样令人讨厌:令人讨厌的是,在你诅咒你的名字之后,你的软件工作人员。

规范化!

答案 1 :(得分:0)

或许 IN 是你的需要。 通过例子

从感兴趣的地方选择* (" IN6330"," IN8408")

This是参考。

答案 2 :(得分:0)

首先,用 |

替换逗号分隔值
$search="IN6330,IN8408";
$result = preg_replace('/[ ,]+/', '|', trim($search));
SELECT * FROM `interests` WHERE `interests` REGEXP $result