Select psql 9.1在一行中合并选择结果

Select psql 9.1在一行中合并选择结果,select,psql,Select,Psql,我有4张桌子,每个桌子都有超过10K的行: Table "public.items" Column | Type | Modifiers ----------------+------------------+--------------- id | integer | not null default nextv

我有4张桌子,每个桌子都有超过10K的行:

                         Table "public.items"
 Column         |           Type   |   Modifiers                      
----------------+------------------+---------------
 id             | integer          | not null default nextval       
 title          | text             | not null   

           Table "public.issues"
Column       |   Type          | Modifiers                                
-------------+-----------------+------------------
id           | integer          | not null default nextval
name         | text             | not null  

 Table "public.authors"
  Column     |        Type          |     Modifiers                       
--------------+---------------------+-----------------------
id           | integer              | not null default  nextval
first_name   | text                 | not null
last_name    | text                 | not null

Table "public.item_issues"
  Column  |  Type   | Modifiers 
----------+---------+-----------
 item_id  | integer | not null
 issue_id | integer | not null


Table "public.item_authors"
 Column   |  Type   | Modifiers 
 -----------+---------+-----------
item_id   | integer | not null
author_id | integer | not null
我想列出所有项目及其作者和问题,知道一个项目可以有多个问题和多个作者。到目前为止,我的select查询返回的是正确的信息,但有几行

查询:

select i.id, i.title, iss.id  as issue_id, iss.name, a.first_name, a.last_name
join item_authors ia on (ia.item_id = i.id) 
join authors a on (a.id = ia.author_id) 
join issues iss on (iss.id = iis.issue_id)
join item_issues iis on (iis.item_id = i.id)   
结果是:

id  | title | issue_id | name    | first_name | last_name       
----|-------|----------|---------|------------|--------------   
 1  |  A    |  22      | elected | David      | Lowes  
 1  |  A    |  54      | health  | David      | Lowes 
 2  |  C    |  10      | art     | Adam       | Dole 
 2  |  C    |  10      | art     | John       | Paul 
 3  |  D    |  28      | eat     | Barbara    | Wu  
 3  |  D    |  17      | weight  | Barbara    | Wu  
 3  |  D    |  54      | health  | Barbara    | Wu  
 3  |  D    |  28      | eat     | Sam        | Sara 
 3  |  D    |  17      | weight  | Sam        | Sara 
 3  |  D    |  54      | health  | Adam       | Dole  
 3  |  D    |  28      | eat     | Adam       | Dole  
 3  |  D    |  17      | weight  | Adam       | Dole 
 3  |  D    |  54      | health  | Sam        | Sara    
但我想:

id  | title | issue_id   |       name          | first_name last_name 
----|-------|------------|---------------------|--------------------------
 1  |  A    | 22,54      | elected, health     | David Lowes 
 2  |  C    | 10         | art                 | John Paul, Adam Dole 
 3  |  D    | 28, 17, 54 | eat, weight, health | Barbara Wu, Sam Sara, Adam Dole   

一次查询是否可行?

使用
array\u agg
array\u to\u string
函数组合可以执行类似操作

select i.id, i.title, 
  array_to_string(array_agg(iss.id), ', ') as issue_id, 
  array_to_string(array_agg(iss.name), ', ') as name, 
  array_to_string(array_agg(a.first_name || a.last_name), ', ') as "first_name last_name"
from issues i
join item_authors ia on ia.item_id = i.id
join authors a on a.id = ia.author_id
join issues iss on iss.id = iis.issue_id
join item_issues iis on iis.item_id = i.id
group by i.id, i.title

使用
array\u agg
array\u to\u string
函数组合,您可以执行以下操作

select i.id, i.title, 
  array_to_string(array_agg(iss.id), ', ') as issue_id, 
  array_to_string(array_agg(iss.name), ', ') as name, 
  array_to_string(array_agg(a.first_name || a.last_name), ', ') as "first_name last_name"
from issues i
join item_authors ia on ia.item_id = i.id
join authors a on a.id = ia.author_id
join issues iss on iss.id = iis.issue_id
join item_issues iis on iis.item_id = i.id
group by i.id, i.title

它给了我一个错误:错误:函数数组_agg(文本,未知)不存在exist@mamesaye我认为括号有问题。这里有一个简单的sqlfiddle来帮助您,感谢它正在工作。我怎样才能去掉双打(D,D):nvm,明白了。在列名之前添加distinct起了作用。这给了我一个错误:错误:函数数组_agg(text,unknown)不起作用exist@mamesaye我认为括号有问题。这里有一个简单的sqlfiddle来帮助您,感谢它正在工作。我怎样才能去掉双打(D,D):nvm,明白了。在列名之前添加distinct就可以做到这一点。