mysql - 在 JSON 字段数组中搜索缺少属性的记录 (MySQL)

标签 mysql json

我有一个包含所有产品的表。产品属性存储在称为属性的 JSON 字段中。在 JSON 对象内部,我有一个用于存储产品图像路径的属性。结构如下所示:

{..., "images": [{"original": "path/to/original", "icon": "path/to/icon", "small": "path/to/small"}, {"original": "path/to/original"}], ...}

正如您所看到的,第二个图像除了原始含义之外没有任何尺寸,我的应用程序应该创建该图像的不同尺寸。问题是我无法过滤这样的记录,这些记录在图像中元素的数组之一中没有“小”或“图标”(或任何任意大小)属性。 我尝试了以下 WHERE 条件:

... WHERE JSON_CONTAINS_PATH(properties, 'one', '$.images') AND JSON_CONTAINS_PATH(properties, 'all', '$.images[*].icon', '$.images[*].small') = 0;

不幸的是,这行不通。根据我的理解,第二个 JSON_CONTAINS_PATH 应该搜索丢失图像数组的任何元素中的图标或小属性的记录。显然事实并非如此。

使用哪个 JSON 函数? (如果 JSON_CONTAINS_PATH 不是用于此目的的正确路径)要对查询进行哪些更改? (如果是)

最佳答案

我不确定这里发生了什么,但我无法重现您的问题。

MySQL [localhost+ ssl/stack] SQL> select * from q1 WHERE JSON_CONTAINS_PATH(pro
erties, 'one', '$.images') and JSON_CONTAINS_PATH(properties,'all','$.images[*]
icon','$.images[*].small');
+----+-------------------------------------------------------------------------
--------------------------------------------------------------------------+
| id | properties
                                                                          |
+----+-------------------------------------------------------------------------
--------------------------------------------------------------------------+
|  1 | {"name": "test", "images": [{"icon": "path/to/icon", "small": "path/to/s
all", "original": "path/to/original"}, {"original": "path/to/original"}]} |
+----+-------------------------------------------------------------------------
--------------------------------------------------------------------------+
1 row in set (0.0013 sec)

和 json_contains_path(properties,'all','$.images[*].icon') 本身和 json_contains_path(properties,'all','$.images.small') 本身工作。

所以我知道正在找到匹配的记录。为了获得“不匹配”,我需要一个不匹配的记录。我将缩小范围,以便新记录在图像数组中没有“小”对象。

MySQL [localhost+ ssl/stack] SQL> insert into q1 (id,properties) values(2,'{"nam
e" : "test2", "images": [{"icon": "path/2/icon", "medium": "path2/icon"}]}');

重新运行您的查询:

MySQL [localhost+ ssl/stack] SQL> select * from q1 WHERE JSON_CONTAINS_PATH(prop
erties, 'one', '$.images') and JSON_CONTAINS_PATH(properties,'all','$.images[*].
icon','$.images[*].small') = 0;
+----+--------------------------------------------------------------------------
------+
| id | properties
      |
+----+--------------------------------------------------------------------------
------+
|  2 | {"name": "test2", "images": [{"icon": "path/2/icon", "medium": "path2/ico
n"}]} |
+----+--------------------------------------------------------------------------
------+
1 row in set (0.0020 sec)

我对“图标”测试得到了类似的结果。所以我不确定什么对你不起作用。

关于mysql - 在 JSON 字段数组中搜索缺少属性的记录 (MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51234887/

相关文章:

iphone - 为什么这个 JSON 仅在 iPhone 中失败?

MySQL:从交叉连接行返回总记录数?

php - mysql查询失败

android - 发送 JSON Post 请求到 Contact Form 7

javascript - jQuery - Ajax 不返回 json 响应

javascript - Angular 在 Controller 中使用 Json 数据

MySql 存储过程、事务和回滚

php - updateOrCreate 在 laravel 中导致 ErrorException

php - Laravel4 验证器和可空字段

javascript - 显示带有数据库数据的线性 Highcharts