1

我想查询

select * from projects where user_id = 3;

并且根据它的结果r,我需要进行n查询,n长度在哪里 。例如:lr

| 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}      |

我听说过关于array_aggpostgres 的功能。也许这就是答案?无论如何,这些是我的表格描述:

                             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

4

3 回答 3

2

array_agg类似于任何其他聚合函数(count、sum),但返回一个数组而不是一个标量值。只需将 2 个表连接和分组,就可以实现您所需要的。

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
于 2016-06-08T13:00:49.763 回答
1

您希望记录来自projectsplusimage names as array匹配的记录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

于 2016-06-08T04:44:25.607 回答
0

对您来说最简单的解决方案可能是子选择。这最接近SELECT您之前提到的个别陈述:

SELECT * FROM images
WHERE project_id IN (
  SELECT project_id FROM projects
  WHERE user_id = 3);
于 2016-06-08T04:16:51.893 回答