我想获取兴趣= IN6330,IN8408的记录。网址为example.com?interests=IN6330,IN8408.
尝试使用以下查询,但一次只能使用一个参数。逗号分隔值可以是单个或多个。
SELECT * FROM `interests` WHERE FIND_IN_SET('IN8408',interests)
答案 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)
答案 2 :(得分:0)
首先,用 |
替换逗号分隔值$search="IN6330,IN8408";
$result = preg_replace('/[ ,]+/', '|', trim($search));
SELECT * FROM `interests` WHERE `interests` REGEXP $result