我当前的查询如下所示:
$query = "SELECT * FROM t WHERE (data LIKE '$findme') OR (data LIKE '%$findme|%') OR (data LIKE '%|$findme%')";
此列中的数据包含由管道符号(“|”)分隔的项目,我需要查询以查找包含此字段中任何项目出现的所有记录。此外,如果此列中只有一个项目,则不会有“|”符号存在。
实施例
$findme = "12";
QUERY SHOULD MATCH:
13|23|12
12
12|23
3|12|42
QUERY SHYULD NOT MATCH:
123|32
34|123
我不确定使用REGEXP是否会使这更容易,但如果是这样,任何解决方案都是受欢迎的。谢谢!
SQLFiddle示例: http://sqlfiddle.com/#!3/32afd/5
答案 0 :(得分:3)
使用REPLACE()
和FIND_IN_SET()
的组合,您可以用逗号替换|
,并在竖线分隔的集合中找到您的值$findme
:
SELECT *
FROM table
/* Replace | with , and search in the set */
WHERE FIND_IN_SET('$find_me', REPLACE(data, '|', ',')) > 0
请注意,仅当data
中的分隔值不包含逗号时,此方法才有效。
从长远来看,对此的适当解决方案是将分隔列data
分离为另一个正确规范化的一对多表。