Mysql查询逗号分隔过滤结果

时间:2014-03-17 12:06:53

标签: php mysql sql search filter

我的表格看起来像这样

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.

如何做到这一点?

2 个答案:

答案 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之前和之后都有空格。

DEMO TO PLAY WITH

答案 1 :(得分:1)

您的数据包含逗号空间分隔列表。这为您提供了两种直接方法:

SELECT *
FROM table 
WHERE concat(', ', $filterrun, ', ') like concat('%, ', pfilter, ', %');

或者echo_me的解决方案略有不同:

SELECT *
FROM table 
WHERE find_in_set($filterrun, replace(pfilter, ', ', ','));

否则,你必须开始处理空格。

但最终,您应该使用单独的关联/联结表。每个id和过滤器值都有一行。