2017-09-28 43 views
1

我有3個表採用這種結構: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(鮑勃)住在倫敦,用戶3(勞拉)住在倫敦和巴黎。

我的問題是:我應該做哪些查詢獲得這種期望的結果?

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;

但陣列的部分是一個我不能老是設法解決。

我創建了一個:string_agg(expression, delimiter)array_agg(expression)由逗號分隔值,如果你真的想文本的陣列,而不是一個文本字符串:DB fiddle for this example

回答

0

您可以使用這些aggregate functions之一,它做的。

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 

您不必使用子查詢,它看起來更清潔這種方式。它會有不同的執行計劃,所以請檢查您的性能以防萬一。

+0

絕對不可思議!,無論是在效率和回答速度。我仍然是SQL的初學者,並且非常想學習......現在我不被允許upvote,但是當我可以的時候,我會回到這篇文章並肯定地讚揚你。謝謝! – Bob

+0

不客氣,特別是有這樣一個很好的問題,也包括小提琴測試答案。我相信你仍然可以接受答案,所以其他尋找未答覆問題的成員將不會看到這個答案。 –