Есть два вида: view1 и view2. view1 имеет элементы, относящиеся к каждому типу, а view2 содержит элементы, относящиеся к типу, и каждый тип относится к каждой группе.
Два отдельных представления и два отдельных вывода, нет необходимости объединять эти два представления.
Я пытался использовать jsonb_build_object и jsonb_agg, но не смог получить.
ожидаемый вывод от views1:
[
{
"userid": 1,
"Name": "Alex",
"types": [
{
"typeid": 1,
"items": [
{
"itemid": 1,
"itemname": "item"
},
{
"itemid": 2,
"itemname": "item"
}
]
},
{
"typeid": 2,
"items": [
{
"itemid": 1,
"itemname": "item"
},
{
"itemid": 2,
"itemname": "item"
}
]
}
]
},
{
"userid": 2,
"Name": "Al",
"types": [
{
"typeid": 1,
"items": [
{
"itemid": 1,
"itemname": "item"
},
{
"itemid": 2,
"itemname": "item"
}
]
},
{
"typeid": 2,
"items": [
{
"itemid": 1,
"itemname": "item"
},
{
"itemid": 2,
"itemname": "item"
}
]
}
]
}
]
ожидаемый результат от views2:
[{
"userid": 1,
"Name": "Alex",
"groups":[{
"groupid":1,
"groupname":"name",
"types": [{
"typeid": 1,
"items": [{
"itemid":1,
"itemname" : "item"
}, {
"itemid": 2,
"itemname":"item"
}]
},{
"typeid": 2,
"items": [{
"itemid":1,
"itemname" : "item"
}, {
"itemid": 2,
"itemname":"item"
}]
}]},{
"groupid":2,
"groupname":"name",
"types": [{
"typeid": 1,
"items": [{
"itemid":1,
"itemname" : "item"
}, {
"itemid": 2,
"itemname":"item"
}]
},{
"typeid": 2,
"items": [{
"itemid":1,
"itemname" : "item"
}, {
"itemid": 2,
"itemname":"item"
}]
}]}
]
}]
view1:
+--------+--------+--------+----------+----------+----------+
| userid | typeid | itemid | username | typename | itemname |
+--------+--------+--------+----------+----------+----------+
| 1 | 1 | 1 | sha | type1 | item1 |
| 1 | 1 | 2 | sha | type1 | item2 |
| 1 | 2 | 1 | sha | type2 | item1 |
| 1 | 2 | 2 | sha | type2 | item2 |
+--------+--------+--------+----------+----------+----------+
выше view1 имеет два типа, и каждый тип имеет два элементы для пользователя.
view2:
+--------+---------+--------+--------+----------+-----------+----------+----------+
| userid | groupid | typeid | itemid | username | groupname | typename | itemname |
+--------+---------+--------+--------+----------+-----------+----------+----------+
| 1 | 1 | 1 | 1 | sha | group1 | type1 | item1 |
| 1 | 1 | 1 | 2 | sha | group1 | type1 | item2 |
| 1 | 1 | 2 | 1 | sha | group1 | type2 | item1 |
| 1 | 1 | 2 | 2 | sha | group1 | type2 | item2 |
| 1 | 2 | 1 | 1 | sha | group2 | type1 | item1 |
| 1 | 2 | 1 | 2 | sha | group2 | type1 | item2 |
| 1 | 2 | 2 | 1 | sha | group2 | type2 | item1 |
| 1 | 2 | 2 | 2 | sha | group2 | type2 | item2 |
+--------+---------+--------+--------+----------+-----------+----------+----------+
выше view2 имеет две группы, и у каждой группы есть два типа, и у каждого типа есть два элемента для пользователя, это как группа по идентификатору пользователя, groupid, typeid, itemid