如何从postgresql中的表列中的am数组中获取另一个表的数据?

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)

Dim*_*ski 6

正如用户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)