PostgreSQL:从3个相关表

时间:2017-09-28 11:05:25

标签: arrays postgresql

我有3个具有这种结构的表:

城市

id  city
1   London 
2   Madrid 
3   Paris 

用户

id  name
1   Bob
2   John
3   Laura

cities_users (此表链接两个以前的表格)

id  city_id   user_id
1     1          1
2     2          2
3     1          3
4     3          3

通过这种方式,我们可以轻松引用用户所在的位置。 例如。在这里,我们看到用户1(Bob)住在伦敦,用户3(Laura)住在伦敦和巴黎。

我的问题是:我应该采取哪种查询来获得所需的结果?

city_id  city   number_users  users
1        London    2          Bob,Laura
2        Madrid    1          John
3        Paris     1          Laura

计数部分我认为我有 SELECT c.id, c.city, coalesce (aux.c_count,0) AS number_users FROM cities c LEFT JOIN ( SELECT city_id, count(*) c_count FROM cities_users GROUP BY city_id ) aux ON aux.city_id = c.id;

但阵列部分是我无法解决的问题。

我创建了一个:DB fiddle for this example

1 个答案:

答案 0 :(得分:0)

如果您真的需要文本数组,而不是一个带逗号分隔值的文本字符串,则可以使用其中一个aggregate functionsstring_agg(expression, delimiter)array_agg(expression)

SELECT c.id, c.city, count(aux.user_id) AS number_users, string_agg(u.name, ',') AS users
  FROM cities c 
  LEFT JOIN cities_users aux ON aux.city_id = c.id
  LEFT JOIN users u ON u.id = aux.user_id
 GROUP BY c.id, c.city;

id  city    number_users    users
1   London  2               Bob,Laura
2   Madrid  1               John
3   Paris   1               Laura

你不必使用子查询,这样看起来更干净。它将有不同的执行计划,因此请检查您的表现以防万一。