繁体   English   中英

Postgres-查询具有多对多关系的表

[英]Postgres - Querying table with many to many relationship

我的架构是这样组成的:

channel -> channels_categories category -> 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来实现这种结果格式?

这是完全未经测试的,但我查看了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的主键。

我只是注意到您确实想要JSON格式的结果,此答案是关于将属性合并和合并到JSON列表中。

您可以使用string_aggconcat将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的答案似乎比这更好地满足了您的需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM