将结果合并到PostgreSQL中的数组

时间:2019-05-22 07:35:24

标签: sql arrays postgresql

我有以下postgresql个表:

Table "public.dates"
Column          |         Type            
----------------+-------------------------
id              | integer                       
start           | timestamp with time zone      
end             | timestamp with time zone     



Table "public.date_participants"
Column   |  Type           
---------+--------
date_id  | integer                  
user_id  | integer      

我想获得一个包含所有参与者的日期作为数组。例如:

{ id: 252, start: xyz, end yzx, participants: [23, 51, 63, 67] }

所以我创建了以下查询:

SELECT
  dates.id,
  json_build_array(participants) as participants
FROM
  dates,
  (SELECT date_id, user_id FROM date_participants) as participants
WHERE dates.id=participants.date_id AND dates.ground_event_id = 252;

但这会导致:

id  |          participants           
----+--------------------------------
252 | [{"date_id":252,"user_id":2}]
252 | [{"date_id":252,"user_id":191}]
252 | [{"date_id":252,"user_id":581}]
252 | [{"date_id":252,"user_id":582}]
(4 rows)

如何将这些行合并为一行,并以其所有user_id作为参与者?

3 个答案:

答案 0 :(得分:2)

您可以将array_agg(user_id)用作select语句的一部分,以将所有参与者聚集在一个数组中。 由于这是汇总,因此必须在一行中产生结果,因此您需要在查询中也使用group by

类似的东西:

SELECT
  d.id,d.start,d.end,
  array_agg(dp.user_id) as participants
FROM
  dates d, date_participants dp      
WHERE d.id=dp.date_id AND d.ground_event_id = 252
group by d.id,d.start,d.end;

答案 1 :(得分:0)

您可以这样做:

select
    dates.id,
    dates.start,
    dates.end,
    json_build_array(
        select user_id from date_participants where date_id = dates.id
    ) as participants
from
    dates

答案 2 :(得分:-1)

在聚合的帮助下,我得到了一个有效的查询:

SELECT
  dates.id,
  dates.start,
  dates.end,
  array_agg(date_participants.user_id) as participants 
FROM
  dates,
  date_participants
WHERE dates.id = date_participants.date_id AND dates.ground_event_id = 252
GROUP BY dates.id;