我使用的是opencart 2.1,客户表上的一个字段是文本数组。数据字段(命名为自定义,键入文本)如下所示:{"2":"2015","1":"2000-11-19"}
基本上,第一部分是生日(不允许null),第二部分是今年(允许null)。使用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:
您可以更新到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
中提取值。但是,当数据结构发生变化并且不是很安全时,这会导致奇怪的错误。