在MYSQL中以逗号分隔的列值搜索post数组

时间:2015-06-08 06:34:05

标签: php mysql

表格 - 列数据

id | filter_data |
---|---------------
1  |2,3,45,67,4  |
2  |2,3,55,33,5,7|

将表单中的变量发布为

$search_filter = {2,3,4,5}

如何获取搜索过滤器中的id

由于

更新:

对不起朋友提出这样一个不好的问题:(

DB design changed,No longer need this :)

1 个答案:

答案 0 :(得分:1)

解决方案1:

正如@Jens评论的那样,将值存储为csv是一个糟糕的数据库设计。 所以第一个解决方案是改变你的数据库设计,因为我真的不知道你要存储什么,你的数据库/代码的目的是什么我不能写一个方案或给出任何有意义的建议。

解决方案2:

使用mySQL的find_in_set功能。

  

如果字符串str在,则返回1到N范围内的值   字符串列表strlist由N个子串组成。字符串列表是   由“,”字符分隔的子串组成的字符串。如果   第一个参数是一个常量字符串,第二个参数是一个类型的列   SET,FIND_IN_SET()函数被优化为使用位运算。   如果str不在strlist中,或者strlist是空字符串,则返回0。   如果任一参数为NULL,则返回NULL。此功能不起作用   如果第一个参数包含逗号(“,”)字符,则正确。

SELECT id FROM table
WHERE FIND_IN_SET(searchFilterHere, filter_data)

解决方案3:

您可以使用LIKE运算符。 (有些成员可能会因为建议而杀了我,但是如果你不想改变你的数据库设计 - 这是创造性的选择)。

让我们检查以下代码:

SELECT id FROM table WHERE filter_data LIKE '%2,%'

问题是它会在filter_data列中返回22,字段的id。 因此,您必须更改该列下的数据,以便,也将显示为第一个和最后一个字符。 例如:

id | filter_data   |
---|---------------
1  |,2,3,45,67,4,  |
2  |,2,3,55,33,5,7,|

现在您可以执行以下操作:

SELECT id FROM table WHERE filter_data LIKE '%,2,%'

如果您有多个“搜索过滤器”,则可以将LIKEOR运算符合并。