2017-08-01 1992 views
0

我的MySQL数据库中有两个字段是数组。数据类型显示为带有(DC2Type:array)注释的LONGTEXT。MySQL在数据库数组字段中搜索值(整数或字符串)字段

例如,存储在这一领域的整数值应该是这样的:
a:4:{i:0;i:9;i:1;i:10;i:2;i:11;i:3;i:12;}

和字符串值应该是这样的:
a:2:{i:0;s:6:"Value1";i:1;s:6:"Value2";}

我需要这些领域的这种方式让我可以存储可过滤的列。例如。第一个可能是年龄组,所以代表年龄段9,10,11,12。

我的查询,则必须获得该说是相关的10岁或在某些情况下,说我想找到那些10和11

我试过IN和FIND_IN_SET语法但也不是所有记录返回任何结果。

使用IN

SELECT * 
FROM table_name 
WHERE MyField IN (10) 

使用FIND_IN_SET

SELECT * 
FROM table_name 
WHERE FIND_IN_SET(MyField,'Value1') > 0; 

我知道阵列可能不是存储值的最佳领域,但我不想为每个AgeGroup例如单独的字段Age1,Age2等或每个类别(例如Value1,Value2等)

有关如何从数据库数组字段中查找值或值的任何想法?

谢谢!

+0

这个数据是PHP'serialize()'格式。有没有简单的方法直接在MySQL中处理它,你需要检索所有的记录,使用'unserialize()'然后在那里测试它。 – Barmar

+0

'FIND_IN_SET'只能使用逗号分隔值。您的字段中的值用';'分隔,而不是','。 – Barmar

回答

0

您可以使用模式匹配。

整数:

WHERE MyField LIKE '%i:10;%' 

字符串:

WHERE MyField LIKE '%s:6:"Value1";%' 

6必须与你要搜索的字符串的长度来代替。

如果你想搜索多个数字或字符串,你可以使用正则表达式与交替:

WHERE MyField RLIKE 'i:(10|11);' 

WHERE MyField RLIKE 's:(6:"Value1"|10:"LongValue2");' 

注意,这些方法都可以使用表上的索引。将数组存储在数据库列中通常是一个坏主意,您应该将它们作为单独的行存储在多对多表中。

+0

谢谢! LIKE和RLIKE都像MySQL中的整数和字符串一样工作。我正在使用Symfony/Doctrine,所以不幸的是它看起来像RLIKE不受支持。现在我必须将过滤条件改为单一结果(所以我们可以使用LIKE),直到我们可以将体系结构更改为多对多而不是序列化数组。欣赏快速反应并提供帮助。 – mbg

+0

'RLIKE'是'REGEXP'的另一个名字。 – Barmar

+0

你不能在多个情况下使用'LIKE',因为它没有交替。你将不得不写'MyField LIKE'%i:10;%'或MyField LIKE'%i:11;%' – Barmar