far*_*a.j 1 sql arrays postgresql select
我正在使用PostgreSQL,我有一个表,我保留了我的用户,而在另一个表中,我保留了包含id和group名称的用户组.在用户的表中,我有一个列,我将每个用户的组ID保存在一个数组中.现在我想获取用户的所有数据以及每个用户的组名.我该怎么办?这是一个例子:用户表:
user_id name roles
1 bob [1, 2]
2 jack [3]
Run Code Online (Sandbox Code Playgroud)
角色表:
role_id name
1 ceo
2 cto
3 financial
Run Code Online (Sandbox Code Playgroud)
我希望有:
user_id name role_name
1 bob CEO, cto
2 jack financial
Run Code Online (Sandbox Code Playgroud)
正如用户LJ01在评论中所说,你应该加入2个表.如果users和groups表具有以下结构:
CREATE TABLE users (
id BIGINT,
name TEXT,
group_ids BIGINT[]
);
CREATE TABLE groups (
id BIGINT,
name TEXT
);
Run Code Online (Sandbox Code Playgroud)
您可以使用以下查询加入表:
SELECT u.*,g.name FROM users u JOIN groups g ON g.id = ANY (u.group_ids);
因此,如果users表具有以下数据:
id name group_ids
1 Test1 {1,2,3}
2 Test2 {3,4}
Run Code Online (Sandbox Code Playgroud)
有4组:
id name
1 Group1
2 Group2
3 Group3
4 Group4
Run Code Online (Sandbox Code Playgroud)
查询的结果将是
1 Test1 {1,2,3} Group1
1 Test1 {1,2,3} Group2
1 Test1 {1,2,3} Group3
2 Test2 {3,4} Group3
2 Test2 {3,4} Group4
Run Code Online (Sandbox Code Playgroud)
更新 用户要求每个用户使用一行,并将这些组聚合在一行中.这可以通过以下查询来实现:
SELECT u.id, u.name,array_agg(g.name) group_names FROM users u JOIN groups g ON g.id = ANY (u.group_ids)
GROUP BY u.id, u.name;
Run Code Online (Sandbox Code Playgroud)
如果我们对答案开头显示的示例数据执行此查询,我们将得到以下结果:
u.id u.name group_names
1 Test1 {Group1,Group2,Group3}
2 Test2 {Group3,Group4}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
259 次 |
| 最近记录: |