我有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
答案 0 :(得分:0)
如果您真的需要文本数组,而不是一个带逗号分隔值的文本字符串,则可以使用其中一个aggregate functions:string_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
你不必使用子查询,这样看起来更干净。它将有不同的执行计划,因此请检查您的表现以防万一。