我正在使用PostgreSQL,我有一个表,我正在保留我的用户,而在另一个表中,我保留了一个包含id和组名的用户组。在用户的表中,我有一个列,我将每个用户的组ID保存在一个数组中。现在我想获取用户的所有数据以及每个用户的组名。我该怎么办?这是一个例子: 用户表:
user_id name roles
1 bob [1, 2]
2 jack [3]
角色表:
role_id name
1 ceo
2 cto
3 financial
我希望有:
user_id name role_name
1 bob CEO, cto
2 jack financial
答案 0 :(得分:6)
正如用户LJ01在评论中所说,你应该加入2个表。 如果users和groups表具有以下结构:
CREATE TABLE users (
id BIGINT,
name TEXT,
group_ids BIGINT[]
);
CREATE TABLE groups (
id BIGINT,
name TEXT
);
您可以使用以下查询加入表格:
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}
有4组:
id name
1 Group1
2 Group2
3 Group3
4 Group4
查询结果为
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
<强>更新强> 用户要求每个用户使用一行,并将这些组聚合在一行中。这可以通过以下查询来实现:
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;
如果我们对答案开始时显示的示例数据执行此查询,我们将得到以下结果:
u.id u.name group_names
1 Test1 {Group1,Group2,Group3}
2 Test2 {Group3,Group4}