我使用的是 opencart 2.1,客户表中的字段之一是文本数组。数据字段(命名为自定义,键入文本)如下所示:
{"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 部分(也就是生日)不变?
有人知道怎么做吗?
谢谢。
最佳答案
解决方案一:
您可以更新到 MySQL 5.7
,其中现在支持 JSON
列字段类型。
所以你的查询看起来像这样:
SELECT * FROM CUSTOMER WHERE MONTH(jsn_extract(custom,"$.1")) = MONTH(NOW()) 和 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
中提取您的值。但是当数据结构发生变化时这会导致奇怪的错误并且不是很安全。
关于php - 处理在 MySQL 中存储为 JSON 对象的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33838737/