2017-09-10 97 views
0

我有一个主表叫做deliveries,它与deliveries_languages有dl,deliveries_markets dm和deliveries_tags dt有delivery_id作为外键有一对多的关系。这三张表分别与语言,市场和标签有一对一的关系。另外,交付,表格与公司有一对一的关系,并且公司_是外部关键。以下是我写的查询:将多行合并成单行PostgreSQL

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_ids因为每个delivery_id有多种语言,市场和标签。我想对不同的delivery_id使用限制,同时我希望将这些多种语言,市场和标签分组并填充为单行。

目前,它看起来像:

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 

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

回答

0

您可以使用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;