我有一个包含所有产品的表。产品属性存储在称为属性的 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/