2016-06-08 1 views
1

Я хочу, чтобы сделать запросКак сделать этот sql с запросом array_agg?

select * from projects where user_id = 3; 

и в зависимости от того, что это результат r, мне нужно сделать n запросов, где n является длинаl из r. например:

| 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_agg функции на Postgres. Может быть, это ответ? В любом случае, это мои описания стола:

       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, как и любой другой агрегатная функция (счет, сумма), но возвращает массив вместо скалярного значения. То, что вам нужно, может быть достигнуто просто путем объединения и группировки двух таблиц.

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

Вы хотите записи из projects плюс записей в image 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