【问题标题】:Merging multiple rows into single row PostgreSQL将多行合并为单行 PostgreSQL
【发布时间】:2018-02-18 23:33:18
【问题描述】:

我有一个名为deliveries 的主表,它与deliveries_languages 作为dl、deliveries_markets dm 和deliveries_tags dt 具有一对多关系,deliveries_tags dt 具有deliveries_id 作为外键。这 3 个表分别与语言、市场和标签具有一对一的关系。另外,deliveries,table 与 company 具有一对一的关系,并且 company_is 作为外键。以下是我写的查询:

SELECT deliveries.*, languages.display_name, markets.default_name, tags.default_name, companies.name
FROM deliveries
JOIN deliveries_languages dl ON dl.delivery_id = deliveries.id 
JOIN deliveries_markets dm ON dm.delivery_id = deliveries.id 
JOIN deliveries_tags dt ON dt.delivery_id = deliveries.id 
JOIN languages ON languages.id = dl.language_id 
JOIN markets ON markets.id = dm.market_id 
JOIN tags ON tags.id = dt.tag_id 
JOIN companies ON companies.id = deliveries.company_id 
WHERE 
deliveries.name ILIKE '%new%' AND 
deliveries.created_by = '5f331347-fb58-4f63-bcf0-702f132f97c5' AND 
deliveries.deleted_at IS NULL 
LIMIT 10

这里我得到了多余的delivery_id,因为每个delivery_id 都有多种语言、市场和标签。我想对不同的delivery_ids 使用限制,同时,我希望将这些多种语言、市场和标签分组并填充在单行中。

目前看起来是这样的:

delivery_id | name |languages | markets  | tags
------------|------|----------|----------|-----------
1           | d1   |en        | au       | tag1
1           | d1   |de        | sw       | tag2
2           | d2   |en        | au       | tag1
2           | d2   |de        | sw       | tag2
3           | d3   |en        | au       | tag1
3           | d3   |de        | sw       | tag2

有什么方法可以让我的数据如下所示:

delivery_id | name |languages | markets  | tags
------------|------|----------|----------|-----------
1           | d1   |en, de    | au,sw    | tag1, tag2
2           | d2   |en, de    | au,sw    | tag1, tag2
3           | d3   |en, de    | au,sw    | tag2, tag3

附:上面的表只包含部分数据,实际查询返回更多的列,但上面是重要的一列。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: postgresql join merge


    【解决方案1】:

    您可以像这样使用GROUP BYstring_agg

    SELECT deliveries.deliver_id, deliver.name, 
           string_agg(distinct languages.display_name, ',' order by languages.display_name) as langs, 
           string_agg(distinct markets.default_name, ',' order by markets.default_name) as markets,
           string_agg(distinct tags.default_name, ',' order by tags.default_name) as tags,
           string_agg(distinct companies.name, ',' order by companies.name) as companies
        ...
        GROUP BY deliveries.deliver_id, deliver.name;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多