我有以下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作为参与者?
答案 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;