我的表格看起来像这样
id pname pfilter 1 onename 24, 36, 120 2 another 22, 124, 1 3 yet 120, 12, 124
我正在尝试运行此查询:
$filterrun = "24";
SELECT * FROM table WHERE pfilter LIKE '$filterrun'
在这个例子中,我希望只显示id#1。而不是id#2和#3,因为它们包含pfilter 124.
如何做到这一点?
答案 0 :(得分:1)
使用FIND_IN_SET
SELECT * FROM table WHERE FIND_IN_SET('$filterrun', pfilter)
如果你有拼写,那么你可以使用这个
SELECT * FROM table WHERE FIND_IN_SET('$filterrun',replace(replace(pfilter, ', ', ','),' ,',','))
编辑:如果你在值之间有空格会很难,你也可以像这样绕过它们。
SELECT * FROM table WHERE
pfilter LIKE ' $filterrun,%'
or pfilter like '$filterrun,%'
or pfilter like '%,$filterrun,%'
or pfilter like '%, $filterrun,%'
or pfilter like '%,$filterrun ,%'
or pfilter like '%,$filterrun %'
or pfilter like '%, $filterrun'
或者使用此
SELECT * FROM table1 WHERE FIND_IN_SET('$filterrun',pfilter)
or FIND_IN_SET(' $filterrun',pfilter)
or FIND_IN_SET('$filterrun ',pfilter)
请注意:$filterrun
之前和之后都有空格。
答案 1 :(得分:1)
您的数据包含逗号空间分隔列表。这为您提供了两种直接方法:
SELECT *
FROM table
WHERE concat(', ', $filterrun, ', ') like concat('%, ', pfilter, ', %');
或者echo_me的解决方案略有不同:
SELECT *
FROM table
WHERE find_in_set($filterrun, replace(pfilter, ', ', ','));
否则,你必须开始处理空格。
但最终,您应该使用单独的关联/联结表。每个id和过滤器值都有一行。