处理存储为MySQL

时间:2015-11-21 01:35:50

标签: php mysql sql arrays

我正在使用opencart 2.1,而customer表上的一个字段是文本数组。数据字段(名为custom,type text)如下所示: {"2":"2015","1":"2000-11-19"} 基本上,第一部分是生日(不允许为空),第二部分是今年(允许空)。它使用serialize($ arr)

保存到数据库中

我需要一个查询来根据“生日”部分获取数据。 基本上,它是这样的:

SELECT * FROM CUSTOMER WHERE MONTH(custom.1) = MONTH(NOW()) AND DAY(custom.2) = DAY(NOW())

我不知道如何引用自定义字段的第1部分或第2部分。如果我可以使查询起作用,我可以将它带回php并使用$ arr = unserialize($ arr)将其获取到数组并使用它。

此外,稍后,我需要更新自定义字段的第2部分(也就是“今年”部分。它可以是null,或者去年,需要更新到今年)。我怎么能这样做,仍然保持第1部分(又名生日)相同?

有人知道怎么做吗?

感谢。

1 个答案:

答案 0 :(得分:1)

解决方案1:

您可以更新为MySQL 5.7,现在支持JSON列字段类型。

所以你的查询看起来像这样:

SELECT * FROM CUSTOMER WHERE MONTH(jsn_extract(custom,"$.1")) = MONTH(NOW()) AND DAY(jsn_extract(custom,"$.2")) = DAY(NOW())

解决方案2:

正常查询数据并使用PHP函数过滤所需的结果 - 例如JSON Decode + DateTime类。

http://php.net/manual/en/class.datetime.php

http://php.net/manual/en/function.json-decode.php

解决方案3:

您可以使用SUBSTRING_INDEX等MySQL函数直接从JSON中提取值。但是,当数据结构发生变化并且不是非常安全时,这会导致奇怪的错误。