MySQL:JSON 列值聚合到按属性分组的单个 JSON 对象中

Posted

技术标签:

【中文标题】MySQL:JSON 列值聚合到按属性分组的单个 JSON 对象中【英文标题】:MySQL: JSON column values aggregate into the single JSON object groupped by property 【发布时间】:2022-01-07 09:21:34 【问题描述】:

我有一个表 variants,其中 properties 列类型为 JSON 和一些数据:

id product_id properties(JSON)
1 1 ["name": "Color", "value": "Black", "name": "Size", "value": "Xl"]
2 1 ["name": "Color", "value": "Red", "name": "Size", "value": "Xl"]
3 1 ["name": "Color", "value": "White", "name": "Size", "value": "L"]
4 2 ["name": "Type", "value": "Circle"]
5 2 ["name": "Type", "value": "Box"]
6 3 NULL

我需要按属性名称和 product_id 获取聚合行,其中每个属性都有一个唯一值数组。预期结果是:

product_id aggregated (JSON)
1 "Color":["Red", "Black", "White"], "Size": ["XL", "L"]
2 "Type": ["Circle", "Box"]

我试图获取 objects 而不是 arrays,但卡住了下一步。

SELECT product_id, JSON_OBJECTAGG(jt.name, jt.value) AS json
FROM variants,
     JSON_TABLE(properties, '$[*]' COLUMNS (
         name VARCHAR(1024) PATH '$.name' NULL ON EMPTY,
         value VARCHAR(1024) PATH '$.value' NULL ON EMPTY)
         ) AS jt
GROUP BY id;

结果:

product_id properties(JSON)
1 "Color": "Black", "Size": "Xl"
1 "Color": "Red", "Size": "Xl"
1 "Color": "White", "Size: "L"
2 "Type": "Circle"
2 "Type": "Box"

那我该如何合并呢?

【问题讨论】:

您的“聚合”没有意义。您在变体表中的数据基本上是产品 1 黑色 XL、产品 1 红色 XL 和产品 1 白色 L。这与产品 1(黑色或红色或白色)(XL 或 L)不同,如您的“聚合”所示建议产品 1 的 6 种变体。 @nnichols 我想收集每个属性的所有唯一值。下一步将是查找遗漏的组合。 【参考方案1】:

我发现我必须将值与名称分开收集,以便稍后将它们聚合到 JSON_OBJECT 中。

WITH props_values(product_id, property_name, values_agg) AS (
    SELECT product_id,
           jt.name,
           JSON_KEYS(JSON_OBJECTAGG(jt.value, ''))
    FROM variants,
         JSON_TABLE(
                 properties,
                 '$[*]'
                 COLUMNS (
                     name VARCHAR(1024) PATH '$.name' NULL ON EMPTY,
                     value VARCHAR(1024) PATH '$.value' NULL ON EMPTY
                     )
             ) AS jt
    WHERE jt.name IS NOT NULL
      AND jt.name <> ''
      AND jt.value IS NOT NULL
      AND jt.value <> ''
    GROUP BY product_id, jt.name
)
SELECT product_id, JSON_OBJECTAGG(property_name, values_agg) AS properties_agg
FROM props_values
GROUP BY product_id;

【讨论】:

以上是关于MySQL:JSON 列值聚合到按属性分组的单个 JSON 对象中的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 聚合函数 和 分组查询(初级)

MySQL 聚合函数 和 分组查询(初级)

Power Query M - 使用自定义聚合(百分位)按列值分组

分组并聚合具有两列值条件的数据框

聚合函数以及MYSQL分组查询——GROUP BY语句(一天一个小技巧,明天你就是专业人士,欧耶!)

聚合函数以及MYSQL分组查询——GROUP BY语句(一天一个小技巧,明天你就是专业人士,欧耶!)