我正在使用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部分(又名生日)相同?
有人知道怎么做吗?
感谢。
答案 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
中提取值。但是,当数据结构发生变化并且不是非常安全时,这会导致奇怪的错误。