2

我当前的查询如下所示:

$query = "SELECT * FROM t WHERE (data LIKE '$findme') OR (data LIKE '%$findme|%') OR (data LIKE '%|$findme%')";

此列中的数据包含由竖线符号 ("|") 分隔的项目,我需要查询来查找包含该字段中出现的任何项目的所有记录。另外,如果此列中只有一项,则不会有“|” 存在的符号。

例子:

$findme = "12";

查询应该匹配:

13|23|12
12
12|23
3|12|42

查询不应该匹配:

123|32
34|123

我不确定使用 REGEXP 是否会使这更容易,但如果是这样,任何解决方案都是受欢迎的。谢谢!

SQLFiddle 示例: http ://sqlfiddle.com/#!3/32afd/5

4

1 回答 1

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到另一个适当规范化的一对多表中。

于 2012-08-18T18:46:29.537 回答