Database 使用GROUP BY和AGGRATE函数内部联接3个表
我有三个表,我正试图用聚合函数和分组方式进行内部连接。我的两个时间表都有一个外键,它引用空格表的id。以下是我的数据:Database 使用GROUP BY和AGGRATE函数内部联接3个表,database,postgresql,inner-join,aggregate-functions,Database,Postgresql,Inner Join,Aggregate Functions,我有三个表,我正试图用聚合函数和分组方式进行内部连接。我的两个时间表都有一个外键,它引用空格表的id。以下是我的数据: Spaces id address 1 'Address 1, city, state, zip' 2 'Address 2, city, state, zip' 3 'Address 3, city, state, zip' 4 'Address 4, city, state, zip' 5 'Address 5, city, s
Spaces
id address
1 'Address 1, city, state, zip'
2 'Address 2, city, state, zip'
3 'Address 3, city, state, zip'
4 'Address 4, city, state, zip'
5 'Address 5, city, state, zip'
Times1
id1 spaces_id start end
1 1 '10am' '1pm'
2 1 '11am' '7pm'
3 1 '1am' '1pm'
4 2 '10am' '9pm'
5 2 '8am' '1pm'
Times2
id2 spaces_id start end
1 1 '10am' '1pm'
2 1 '11am' '7pm'
3 1 '1am' '1pm'
4 2 '10am' '9pm'
5 2 '8am' '1pm'
我希望输出的数据如下所示(将两个表中的时间组合成一个带有start和end属性的时间数组):
我已成功地将此数据与spaces表和ONE time表以及以下查询组合在一起:
SELECT s.*, JSON_STRIP_NULLS(JSON_AGG(JSON_BUILD_OBJECT('start', t.start, 'end', t.end)))
AS times
FROM spaces s
LEFT OUTER JOIN times t
ON s.id = t.space_id
GROUP BY s.id
您的结构和您编写的查询之间存在一些不一致之处,因此我做了一些假设。因此,您可能需要调整查询
SELECT
s.id,
s.address,
COALESCE(json_agg(d.json) filter (WHERE d.json IS NOT NULL), '[]')
FROM spaces s
LEFT JOIN (
SELECT
spaces_id,
json_build_object('start', start, 'end', "end") AS json
FROM (
SELECT * FROM times1
UNION ALL
SELECT * FROM times2
) t
) d ON d.spaces_id = s.id
GROUP BY s.id, s.address;
说明:
在第一步中,我们通过合并两个时间表来构造一个数据集d
,这样我们就得到了一个空间id和所需的JSON对象
然后我们选择空格并左键连接数据集
d
。对于d
中没有任何数据的空间,我们不希望json\u agg
,这将导致[null]
。相反,我们过滤掉这些,这将导致null
。为了防止null
我们将合并成一个空的JSON数组。在您的结构和您编写的查询之间存在一些不一致的地方,因此我做了一些假设。因此,您可能需要调整查询
SELECT
s.id,
s.address,
COALESCE(json_agg(d.json) filter (WHERE d.json IS NOT NULL), '[]')
FROM spaces s
LEFT JOIN (
SELECT
spaces_id,
json_build_object('start', start, 'end', "end") AS json
FROM (
SELECT * FROM times1
UNION ALL
SELECT * FROM times2
) t
) d ON d.spaces_id = s.id
GROUP BY s.id, s.address;
说明:
在第一步中,我们通过合并两个时间表来构造一个数据集d
,这样我们就得到了一个空间id和所需的JSON对象
然后我们选择空格并左键连接数据集d
。对于d
中没有任何数据的空间,我们不希望json\u agg
,这将导致[null]
。相反,我们过滤掉这些,这将导致null
。为了防止null
我们将合并成一个空的JSON数组。@TaylerBantle,我的回答有什么帮助吗?@fphilipe有,非常感谢@泰勒班特,我的回答有什么帮助吗?@fphilipe是的,有,非常感谢!