我的架构是这样组成的:
channel
- > channels_categories
- > category
频道可以有多个类别,类别可以属于多个频道。
当我查询频道时,我想用它们获取频道类别。
无论如何,如果我使用JOIN
,我只会为每个类别获取重复的频道。
[
{
"channel_name": "Channel1",
"category_name": "Category1",
"category_id": "1"
},
{
"channel_name": "Channel1",
"category_name": "Category2"
"category_id": "2"
}
]
理想的结果格式(JSON)类似于:
{
channel_name: 'Channel1',
categories: [{/**category**/}, ....]
}
有没有办法可以用SQL实现这种结果格式?
答案 0 :(得分:3)
这是完全未经测试的,但是我已经查看了JSON函数的手册,看起来以下内容可能会有效:
select jsonb_build_object(
'channel_name', channel.name,
'categories', jsonb_agg(
jsonb_build_object(
'category_id', category.id,
'category_name', category.name
)
)
)
from channel
join channels_categories on channel.id = channel_id
join category on category.id = category_id
group by channel.id
这假设channel
有一个名为id
的主键。
答案 1 :(得分:0)
我刚才注意到你真的想要JSON格式的结果,这个答案是关于将属性合并并合并到JSON列表中。
您可以使用string_agg和concat将category_name和category_id合并到以下列表中:
select channel_name,
concat('[', string_agg(category_name, ','), ']') as category_names,
concat('[', string_agg(cast(category.id as text), ','), ']') as category_ids
from
channel inner join channel_category on channel.id = channel_category.channel_id
inner join category on channel_category.category_id = category.id
group by channel_name;
产生如下结果:
| channel_name | category_names | category_ids |
| channel1 | [category1,category2]| [1,2] |
对于完整的JSON结果melpomene's,答案似乎比这更适合您的需求。