【问题标题】:MySQL: JSON column values aggregate into the single JSON object groupped by propertyMySQL:JSON 列值聚合到按属性分组的单个 JSON 对象中
【发布时间】: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 我想收集每个属性的所有唯一值。下一步将是查找遗漏的组合。

标签: mysql sql json aggregates


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2018-06-21
    • 2016-07-03
    相关资源
    最近更新 更多