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

sirbozc5  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(408)

我有一张table,里面有所有的产品。产品属性存储在名为properties的json字段中。在json对象中,我有一个用于存储产品映像路径的属性。结构如下所示:

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

如你所见,第二张图片没有任何大小,除了原来的意思,我的应用程序应该创建不同大小的图片。问题是我无法过滤像这样的记录,因为这些记录在图像中的某个数组元素中没有“small”或“icon”(或任意大小)属性。我尝试了以下条件:

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

不幸的是这行不通。据我所知,第二个json_contains_路径应该搜索在images数组的任何元素中丢失图标或小属性的记录。显然不是这样。
使用哪个json函数(如果json包含(路径不是用于此目的的正确路径)在查询中要更改什么(如果是的话)

ego6inou

ego6inou1#

我不确定这是怎么回事,但我不能重现你的问题。

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_本身包含_路径(properties,'all','$.images[*].icon'),json_本身包含_路径(properties,'all','$.images.small')。
所以我知道匹配的记录正在被找到。要得到“不匹配”,我需要一张不匹配的唱片。我将缩小它的范围,以便新记录在images数组中没有“小”对象。

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)

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

pzfprimi

pzfprimi2#

我通过使用两种不同的查询解决了问题:
首先,我尝试计算一个产品上传的最大图像数:

select max(json_length(properties, '$.images')) as max_nr_images from products where json_contains_path(properties, 'one', '$.images[0]') group by json_length(properties, '$.images');

然后我根据这个数字形成where条件:

select * from products where json_contains_path(properties, 'one', '$.images[0]') and (json_contains_path(properties, 'all', '$.images[0].icon', '$.images[0].small') = 0 or if(json_contains_path(properties, 'one', '$.images[1]'), json_contains_path(properties, 'all', '$.images[1].icon', '$.images[1].small'), 1) = 0 or if(json_contains_path(properties, 'one', '$.images[2]'), json_contains_path(properties, 'all', '$.images[2].icon', '$.images[2].small'), 1) = 0 or if(json_contains_path(properties, 'one', '$.images[3]'), json_contains_path(properties, 'all', '$.images[3].icon', '$.images[3].small'), 1) = 0 or if(json_contains_path(properties, 'one', '$.images[4]'), json_contains_path(properties, 'all', '$.images[4].icon', '$.images[4].small'), 1) = 0);

(这张是四张图片。)

相关问题