2016-06-08 44 views
1

我想打一个查询如何使查询array_agg与此SQL?

select * from projects where user_id = 3; 

,并根据它的结果r,我需要做n查询,其中n长度rl。例如:

| id | project_name | description | user_id | 
| 1 | Project A | lorem ipsu | 3  | 
| 4 | Project B | lorem ipsu | 3  | 

l => 2然后

select * from images where project_id = 1; 
select * from images where project_id = 4; 

好吧,你可以看到这是怎么回事,如果l太大。选择太多,访问数据库太多。有没有更好的方式来实现一个最终的结果,像这样:

| id | project_name | description | user_id | images   | 
| 1 | Project A | lorem ipsu | 3  | {imgX,imgY,imgZ} | 
| 4 | Project B | lorem ipsu | 3  | {imgA,imgB}  | 

我听到的Postgres约array_agg功能。也许这就是答案?不管怎么说,这些都是我的表说明:

       Table "public.projects" 
    Column |   Type   |       Modifiers      
-------------+--------------------------+------------------------------------------------------- 
id   | integer     | not null default  nextval('projects_id_seq'::regclass) 
name  | character varying(255) | 
description | character varying(255) | 
user_id  | integer     | 
created_at | timestamp with time zone | 
updated_at | timestamp with time zone | 

            Table "public.images" 
    Column |   Type   |      Modifiers      
------------+--------------------------+----------------------------------------------------- 
id   | integer     | not null default nextval('images_id_seq'::regclass) 
name  | character varying(255) | 
url  | character varying(255) | 
project_id | integer     | 
created_at | timestamp with time zone | 
updated_at | timestamp with time zone | 

谢谢你提前:d

回答

1

array_agg是像任何其他集合函数(count,sum),但返回一个数组而不是标量值。您只需加入并分组两个表即可实现您所需要的内容。

SELECT p.id, p.name, p.description, p.user_id, array_agg(i.name) images 
FROM projects p 
LEFT JOIN images i ON p.id = i.project_id 
GROUP BY p.id, p.name, p.description, p.user_id 
+0

解释询问太 –

+0

对不起,我认为这很容易理解。编辑。 –

0

可能是你最简单的解决方案是一个子选择。这是最接近您在前面提到的个别SELECT声明:

SELECT * FROM images 
WHERE project_id IN (
    SELECT project_id FROM projects 
    WHERE user_id = 3); 
0

你想在image names as array匹配从projects记录加上记录由project_id

SELECT * 
FROM projects 
LEFT JOIN LATERAL (SELECT array_agg(name) AS images FROM images WHERE project_id = projects.project_id) x ON true 
WHERE user_id = '3' 

sqlfiddle