我有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'的未实现价值的记录? 谢谢!
答案 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-7
,2007-8-07
,2007-8-07
或2007-08-07
的所有行(所有这些都是日期的有效表示)。
它还会查找包含2007-12-01 2008-01-13 2007-11-19
等数据的行。但这就是为什么它是第一阶段的搜索。
然后,在你的第二个搜索阶段,你应该将匹配的行读入你的php程序,将它们反序列化为它们的结构,并搜索你需要的确切信息。
您可以在第一阶段使用REGEXP搜索而不是LIKE。没关系。但是如果你想要一种强有力的方法来搜索这些信息,你需要编写搜索的第一阶段,这样就不会错过任何有效的数据 - 不会产生任何误报。你也可以保持第一个搜索阶段的简单。
其他人建议重构您的数据库,以便将其标准化。如果搜索是大规模应用程序的重要组成部分,那么有一天你将完成重构工作。但是你可以通过这个两阶段战术解决你眼前的问题。