Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 使用GROUP BY和AGGRATE函数内部联接3个表_Database_Postgresql_Inner Join_Aggregate Functions - Fatal编程技术网

Database 使用GROUP BY和AGGRATE函数内部联接3个表

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

我有三个表,我正试图用聚合函数和分组方式进行内部连接。我的两个时间表都有一个外键,它引用空格表的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, 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是的,有,非常感谢!