2017-09-10 1 views
0

J'ai une table principale appelée livraisons et elle a une relation à plusieurs avec deliveries_languages ​​comme dl, deliveries_markets dm et deliveries_tags dt ayant la livraison_id comme clé étrangère. Ces 3 tableaux ont une relation un à un avec les langues, les marchés et les tags respectivement. De plus, les livraisons, les tables ont une relation un à un avec les entreprises et ont company_is comme clé étrangère. Voici une requête que je l'ai écrit:Fusion de plusieurs lignes en une seule ligne 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 

Ici, je reçois delivery_ids redondantes car pour chaque delivery_id il y a plusieurs langues, les marchés et les mots clés. Je souhaite utiliser des limites sur des delivery_ids distincts et en même temps, je souhaite que ces multiples langues, marchés et tags soient regroupés et remplis sur une seule ligne.

Actuellement, il ressemble à:

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 

Est-tere quelque façon que ce que je peux avoir des données ressemblent ci-dessous:

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 

P.S. Les tables ci-dessus ne contiennent qu'une partie des données, la requête réelle renvoie beaucoup plus de colonnes mais ci-dessus sont importantes ici. Quelqu'un peut-il m'aider s'il vous plaît à résoudre ce problème.

Répondre

0

Vous pouvez utiliser GROUP BY avec string_agg comme ceci:

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;