Arrays PostgreSQL向数组中添加多个结果

Arrays PostgreSQL向数组中添加多个结果,arrays,postgresql,aggregate,multiple-columns,postgresql-8.4,Arrays,Postgresql,Aggregate,Multiple Columns,Postgresql 8.4,你好,堆栈溢出用户 我试图收集用户及其所有权限的列表,但我希望聚合这些权限,以便它们在用户的单个记录中列出 users表非常简单,但是权限是单独划分的 举个例子,共有3个表:用户、用户访问、页面 此外,我还坚持使用PostgreSQL v8.4 数据大致如下所示: user_id,username,permissions 1,bob,{report_1:<null>} 1,bob,{report_2:<null>} 1,bob,{report_3:<null>

你好,堆栈溢出用户

我试图收集用户及其所有权限的列表,但我希望聚合这些权限,以便它们在用户的单个记录中列出

users表非常简单,但是权限是单独划分的

举个例子,共有3个表:用户、用户访问、页面

此外,我还坚持使用PostgreSQL v8.4

数据大致如下所示:

user_id,username,permissions
1,bob,{report_1:<null>}
1,bob,{report_2:<null>}
1,bob,{report_3:<null>}
1,bob,{admin:<null>}
1,bob,{users:true}
1,bob,{options:<null>}
1,bob,{addl_options:true}
1,bob,{advanced:false}
用户表

user_id,username
1,bob
2,cindy
3,jen
id,user_id,page_id,allowed
1,1,5,true
2,1,7,true
3,1,8,false
4,2,4,true
5,2,5,true
6,2,7,false
7,3,1,true
8,3,5,false
page_id,page_name
1,report_1
2,report_2
3,report_3
4,admin
5,users
6,options
7,addl_options
8,advanced
用户访问表

user_id,username
1,bob
2,cindy
3,jen
id,user_id,page_id,allowed
1,1,5,true
2,1,7,true
3,1,8,false
4,2,4,true
5,2,5,true
6,2,7,false
7,3,1,true
8,3,5,false
page_id,page_name
1,report_1
2,report_2
3,report_3
4,admin
5,users
6,options
7,addl_options
8,advanced
页面表格

user_id,username
1,bob
2,cindy
3,jen
id,user_id,page_id,allowed
1,1,5,true
2,1,7,true
3,1,8,false
4,2,4,true
5,2,5,true
6,2,7,false
7,3,1,true
8,3,5,false
page_id,page_name
1,report_1
2,report_2
3,report_3
4,admin
5,users
6,options
7,addl_options
8,advanced
到目前为止,我已经能够为权限创建一个数组,但我只获取一个页面权限,并显示是否允许的结果。我很难弄清楚如何收集其余的页面,以及它们在一个单元格中为每个用户设置了什么

到目前为止,我所拥有的:

select users.user_id, users.username,
    (select array(select page.page_name || ':' || user_access.allowed)
        where users.user_id = user_access.user_id and page.page_id = user_access.page_id) as permissions
from users
    full join user_access on users.user_id = user_access.user_id
    full join page on page.page_id = user_access.page_id;
但这只会返回如下结果:

user_id,username,permissions
1,bob,{report_1:<null>}
1,bob,{report_2:<null>}
1,bob,{report_3:<null>}
1,bob,{admin:<null>}
1,bob,{users:true}
1,bob,{options:<null>}
1,bob,{addl_options:true}
1,bob,{advanced:false}
user\u id、用户名、权限
1,鲍勃,{报告1:}
1,鲍勃,{报告2:}
1,鲍勃,{报告3:}
1,bob,{admin:}
1,bob,{users:true}
1,bob,{options:}
1,bob,{addl_options:true}
1,bob,{advanced:false}
我想取回的是每个用户记录的所有权限,如下所示:

user_id,username,permissions        (where permissions is an array of <page_name>:<allowed>)
1,bob,{report_1:<null>,report_2:<null>,report_3:<null>,admin:<null>,users:true,options:<null>,addl_options:true,advanced:false}
2,cindy,{report_1:<null>,report_2:<null>,report_3:<null>,admin:true,users:true,options:<null>,addl_options:false,advanced:<null>}
3,jen,{report_1:true,report_2:<null>,report_3:<null>,admin:<null>,users:false,options:<null>,addl_options:<null>,advanced:<null>}
user\u id、用户名、权限(其中权限是一个数组:)
1,bob,{report_1:,report_2:,report_3:,admin:,users:true,options:,addl_options:true,advanced:false}
2,cindy,{report_1:,report_2:,report_3:,admin:true,users:true,options:,addl_options:false,advanced:}
3,jen,{report_1:true,report_2:,report_3:,admin:,users:false,options:,addl_options:,advanced:}
我很感激你能提供的任何建议


谢谢大家!

用户和页面之间需要交叉连接,然后是权限的外部连接。然后需要对结果进行分组:

select u.user_id, array_agg(concat(p.page_name, ':', coalesce(ua.allowed::text, '<null>')) order by p.page_name)
from users u
  cross join page p
  left join user_access ua on ua.page_id = p.page_id and ua.user_id = u.user_id
group by u.user_id;  
选择u.user\u id,数组\u agg(concat(p.page\u name,,:',coalesce(ua.allowed::text,))按p.page\u name排序)
来自用户u
交叉连接页
左联合用户访问ua.page\u id=p.page\u id和ua.user\u id=u.user\u id上的ua
按用户id分组;
在线示例:


(在在线示例中,我使用了
string\u agg()
而不是
array\u agg()
,因为rextester不能很好地显示数组)

Postgres 8.4已经使用了5年了。你现在真的应该计划升级了。谢谢你的反馈。其中一部分用于升级到使用受支持版本的新系统。但这不是重点。谢谢你,一匹没有名字的马。这至少让我找到了正确的方向。不幸的是,直到PostgreSQL v9.1才支持concat(),因此我不得不对其进行修改,并最终得到以下结果:
select u.user_id,(array_agg(coalesce(p.page_name | | | | | | | | | | | | | | | | | | | |作为用户的权限u交叉加入页面p左加入用户访问ua上的ua.page\u id=p.page\u id和ua.user\u id=u.user\u id按u.user\u id分组