2015-06-08 79 views
-1

表 - 列数据搜索交阵列中逗号在MYSQL分隔的列值

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

邮政变量从形式

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

我怎样才能获得id其在搜索过滤器

谢谢

UPDATE:

对不起朋友如此糟糕的问题:(

DB design changed,No longer need this :) 
+5

将值存储为csv是非常不好的数据库设计 – Jens

+0

下次将记录下谢谢 – epynic

+0

您可以使用函数find_in_set在mysql中查找csv中的值 – Jens

回答

1

解决方案1:

由于@Jens评论说,这是一个坏DB设计来存储值为csv。 所以第一个解决方案是改变你的数据库设计,因为我不知道你在存储什么,你的db/code的目的是什么,我不能写一个方案或给出任何有意义的建议。

解决方案2:

使用MySQL的find_in_set功能。

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

SELECT id FROM table 
WHERE FIND_IN_SET(searchFilterHere, filter_data) 

解决方案3:

可以使用LIKE操作。 (有些成员可能会因为暗示我而杀了我,但是如果你不想改变你的db设计 - 这是创造性的选择)。

让我们来看看下面的代码:

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

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

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,%' 

如果您有多个“搜索过滤器”,你可以用OR运营商LIKE小号组合。

+0

感谢队友,更新了DB架构!,这让我的生活更轻松 – epynic