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 对象中的主要内容,如果未能解决你的问题,请参考以下文章
Power Query M - 使用自定义聚合(百分位)按列值分组