我当前的查询如下所示:
$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
最佳答案
使用 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
分离到另一个正确规范化的一对多表中。
关于mySQL:包含 | 的选择查询出现问题符号(LIKE 和/或 REGEXP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12021243/