【问题标题】:Dealing with data stored as JSON objects in a MySQL在 MySQL 中处理存储为 JSON 对象的数据
【发布时间】:2015-11-21 01:35:49
【问题描述】:

我使用的是 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 部分(也就是“今年”部分。它可以为空,也可以是去年,并且需要更新到今年)。我怎样才能做到这一点并且仍然保持第 1 部分(也就是生日)不变?

有人知道怎么做吗?

谢谢。

【问题讨论】:

  • 您是否尝试过使用json_decode?您必须将结果作为字符串提取。
  • 除非你能用Mysql 5.7,并且改变列的类型,用购物车软件没问题,那你就得用字符串对比整个字符串,而不仅仅是它的一部分。或者,使用LIKE 寻找独特的部分——不是很可靠。以这种方式存储数据通常不是一种好的做法,因为正如您所经历的那样,很难将其包含在查询中。我知道你没有这样设置,但你正在从别人的错误中吸取教训。
  • 我对json_decode不是很熟悉,不能用Mysql 5.7。你能告诉我更多关于如何在这个例子中使用 json_decode 的细节吗?

标签: php mysql sql arrays


【解决方案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 解码 + DateTime 类)正常查询数据并过滤您需要的结果。

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

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


解决方案 3:

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

【讨论】:

  • 我对json_decode不是很熟悉,不能用Mysql 5.7。你能给我更多关于在这种情况下如何使用 json_decode 的解决方案吗?谢谢!
  • 所以我可以用substring_index 做到这一点,而且它很乱。但如果暂时没有其他办法,我可能不得不接受它。 SELECT * FROM 'rwy_customer' WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(custom_field,'-',-2),'-',1) = MONTH(NOW()) AND SUBSTRING_INDEX(SUBSTRING_INDEX(custom_field,'-',-1),'"',1) = DAY(NOW())
猜你喜欢
  • 2017-05-03
  • 1970-01-01
  • 2022-09-28
  • 2017-12-24
  • 1970-01-01
  • 2010-09-20
  • 2012-05-06
  • 2019-09-15
  • 2013-07-13
相关资源
最近更新 更多