如何在MySQL 8中将子记录聚合到JSON对象中

vltsax25  于 2023-05-05  发布在  Mysql
关注(0)|答案(1)|浏览(120)

在MySQL 8中,我有一个parent表,它与它的child表有一对多的关系。child表很简单,它包含一个rule列(具有任意规则名称(例如,'a'和'b'))和一个status列(具有预定义的一组值(例如,'PASS'或'FAIL')),以及对其parent记录的反向引用。对于每一个parent行,我想根据rulestatus作为JSON对象的计数来聚合和计算child行的数量。下面是两个表的模式和希望的结果来说明问题:
parent表包含一个简单的id:
| 身份证|
| --------------|
| 1|
| 二|
| 三|
child表具有rulestatus值(仅关注parent.id=1):
| 身份证|父ID|规则|地位|
| --------------|--------------|--------------|--------------|
| 六|1|“一”|“通过”|
| 七|1|“一”|“未通过”|
| 八|1|“一”|“未通过”|
| 九|1|'B'|“通过”|
| 10个|1|'B'|“未通过”|
| 十一|1|'B'|“未通过”|
理论上,我想查询parent的所有child记录,并根据计数按rule分组,按status分组。例如,在上面的数据中,对parent.id = 1进行查询会产生这样的结果(抱歉,格式不好):
parent_id = 1

{
  "a": {
    "PASS": 1,
    "FAIL": 2
  },
  "b": {
    "PASS": 2,
    "FAIL": 1
  }
}

这可能吗?我尝试混合group_concatlateral join、json_arrayaggjson_object......但我无法得到真实的的结果。有什么想法吗
注意:如果有帮助,JSON结构不必完全像这样,甚至JSON,只要在客户端(Node.js)获得信息后,我可以用相同的信息解析,但我想避免冗余数据以减少I/O开销。

mctunoxg

mctunoxg1#

您可以使用JSON_OBJECT和JSON_OBJECTAGG来实现所需的结果:

-- Run the query to produce the desired result
SELECT parent_id,
       JSON_OBJECTAGG(rule, rule_status) as rule_status
FROM (
    SELECT parent_id,
           rule,
           JSON_OBJECT('PASS', SUM(status = 'PASS'), 'FAIL', SUM(status = 'FAIL')) as rule_status
    FROM child
    WHERE parent_id = 1
    GROUP BY parent_id, rule
) as subquery
GROUP BY parent_id;
父ID规则状态
1{“a”:{“FAIL”:2,“PASS”:1},“B”:{“FAIL”:2,“PASS”:1}}

fiddle

  • 子查询按parent_id和rule对数据进行分组,并计算每组的“PASS”和“FAIL”之和。
  • 然后选择parent_id、rule以及将JSON_OBJECT()应用于状态和条件表达式的结果。
  • 外部查询按parent_id对数据进行分组,并将JSON_OBJECTAGG()函数应用于rule和rule_status列。
  • 然后选择parent_id和将JSON_OBJECTAGG()应用于rule和rule_status的结果。

https://dev.mysql.com/doc/refman/5.7/en/aggregate-functions.html#function_json-objectagg

相关问题