在MySQL 8中,我有一个parent
表,它与它的child
表有一对多的关系。child
表很简单,它包含一个rule
列(具有任意规则名称(例如,'a'和'b'))和一个status
列(具有预定义的一组值(例如,'PASS'或'FAIL')),以及对其parent
记录的反向引用。对于每一个parent
行,我想根据rule
和status
作为JSON对象的计数来聚合和计算child
行的数量。下面是两个表的模式和希望的结果来说明问题:parent
表包含一个简单的id:
| 身份证|
| --------------|
| 1|
| 二|
| 三|child
表具有rule
和status
值(仅关注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_concat
、lateral
join、json_arrayagg
和json_object
......但我无法得到真实的的结果。有什么想法吗
注意:如果有帮助,JSON结构不必完全像这样,甚至JSON,只要在客户端(Node.js)获得信息后,我可以用相同的信息解析,但我想避免冗余数据以减少I/O开销。
1条答案
按热度按时间mctunoxg1#
您可以使用JSON_OBJECT和JSON_OBJECTAGG来实现所需的结果:
fiddle
https://dev.mysql.com/doc/refman/5.7/en/aggregate-functions.html#function_json-objectagg