【问题标题】:PostgreSQL: Join 2 tables based on an array (foreign key) columnPostgreSQL:基于数组(外键)列连接 2 个表
【发布时间】:2018-11-19 04:01:54
【问题描述】:

我正在使用 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

【问题讨论】:

  • 你应该加入他们
  • @LJ01 但用户表中组的 id 在数组中!不知道如何循环进入数组并找到名字
  • Edit您的问题并添加一些sample data 和基于该数据的预期输出。 Formatted textno screen shotsedit 您的问题 - 请不要在 cmets 中提供邮政编码或其他信息。
  • @a_horse_with_no_name我编辑了我的问题!你现在能帮忙吗?
  • @fariba.j 我更新了答案以符合您的要求

标签: sql arrays postgresql select


【解决方案1】:

正如用户 LJ01 在 cmets 中所说,您应该加入 2 个表。 如果用户和组表具有以下结构:

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}

【讨论】:

  • 感谢它正在工作,但它返回所有具有 group_ids 的行。 group_ids = null 的行怎么办?
  • 如果要返回group_ids = null的用户,请将JOIN部分替换为LEFT JOIN
猜你喜欢
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 2017-12-15
相关资源
最近更新 更多