如何使用mysql在序列化字段中搜索?

时间:2016-11-19 09:35:38

标签: php mysql

我有mysql数据库,并且每个记录都有字段(字段名称为stock),其中填充了序列化字符串,如下所示(示例数据):

a:3:{i:0;a:5:{i:1;s:4:"1.30";s:1:"x";s:4:"4.75";i:2;s:5:"11.00";s:6:"update";s:19:"2007-08-12 09:35:12";s:6:"status";s:3:"Run";}i:1;a:5:{i:1;s:4:"1.33";s:1:"x";s:4:"4.50";i:2;s:5:"10.00";s:6:"update";s:19:"2007-08-07 15:51:01";s:6:"status";s:3:"Run";}i:2;a:5:{i:1;s:4:"1.31";s:1:"x";s:4:"4.53";i:2;s:5:"10.10";s:6:"update";s:19:"2007-8-1 21:09:19";s:6:"status";s:3:"Run";}}

这个字段由这个数组序列化如下:

array(
   [0]=>Array([1]=>1.30,[x]=>4.75,[2]=>11.00,[update]=>2007-8-12 09:35:12,[status]=>Run)
   [1]=>Array([1]=>1.33,[x]=>4.50,[2]=>10.00,[update]=>2007-8-7 15:51:01,[status]=>Run)
   [2]=>Array([1]=>1.31,[x]=>4.53,[2]=>10.10,[update]=>2007-8-1 21:09:19,[status]=>Run)
)

我的问题是我如何搜索其数组['update']> 2007-8-7和数组['1']> 1.32的字段'stock'的未实现价值的记录? 谢谢!

2 个答案:

答案 0 :(得分:0)

在MYSQL中,您可以使用LIKE运算符搜索字符串。它会比普通领域慢。 如果您在字段中有1个值

使用示例:

SELECT {your code here}
WHERE {your field name} LIKE '%[update]=>2007-8-7%'

%表示此子字符串前后的任何符号。它将在字符串

中搜索此模式

如果要检查多个值,则有3个选项:

编辑LIKE模式

您可以将LIKE模式编辑为2个字符串:

LIKE '%[1]=>1.32%[update]=>2007-8-7%'

此字符串将在字符串

中搜索2个值

添加第二个LIKE运算符

第二个选项是写LIKE运算符2次。 例如:

SELECT {your code here}
WHERE
    {field} LIKE '%[1]=>1.32%'
    AND {field} LIKE '%[update]=>2007-8-7%'

使用正则表达式

对于像您这样的复杂字段,您可以尝试使用regexp。 您可以使用以下命令通过正则表达式执行搜索: 警告!错误的代码!

SELECT {your code here}
WHERE {field} REGEXP '[^}]*s:4:"{ARRAY[1] TARGET VALUE}"[^}]*s:19:"{TARGET DATE}[^"]*".*'

它将返回包含您要查找的值的所有FIELDS。 然后,您可以手动使用代码中所需的查找值。

答案 1 :(得分:0)

这些包含序列化数据的文本字符串不是用于使用纯SQL进行搜索。如果您尝试仅使用纯SQL搜索它们Murphy's Law 攻击您。

所以,你需要一个两阶段的搜索。你将用SQL编写的第一个阶段。它必须设计为误报而不是误报。也就是说,它应该不会错过您想要的行,即使它必须引入一些您不想要的额外行。例如,您想要的日期搜索

   column LIKE '%2007-%8-%7%'

所以它会找到包含2007-8-72007-8-072007-8-072007-08-07的所有行(所有这些都是日期的有效表示)。

它还会查找包含2007-12-01 2008-01-13 2007-11-19等数据的行。但这就是为什么它是第一阶段的搜索。

然后,在你的第二个搜索阶段,你应该将匹配的行读入你的php程序,将它们反序列化为它们的结构,并搜索你需要的确切信息。

您可以在第一阶段使用REGEXP搜索而不是LIKE。没关系。但是如果你想要一种强有力的方法来搜索这些信息,你需要编写搜索的第一阶段,这样就不会错过任何有效的数据 - 不会产生任何误报。你也可以保持第一个搜索阶段的简单。

其他人建议重构您的数据库,以便将其标准化。如果搜索是大规模应用程序的重要组成部分,那么有一天你将完成重构工作。但是你可以通过这个两阶段战术解决你眼前的问题。