2017-09-28 11 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(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;

でそれを持っていると思うが、配列の一部は、私が解決するために管理しcan`t一つです。

私が作成しました:DB fiddle for this example

答えて

0

あなたがそれらaggregate functionsのいずれかを使用してそれを行うことができます:あなたは本当に代わりに、カンマで区切られた値を持つ1つのテキスト文字列のテキストの配列を、必要な場合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 

サブクエリを使用する必要はありません。この方法ではきれいに見えます。それは異なる実行計画を持つので、場合によってはあなたのパフォーマンスをチェックしてください。

+0

効率性と応答速度の両方において、絶対に信じられないほど!私はまだSQLとhavoの初心者ですので、学ぶのは大変です...今、私はupvoteを許可されていませんが、私はこのポストに戻ってあなたをアップルボートします。ありがとう! – Bob

+0

あなたは歓迎されています、特に答えをテストするためのフィドルも含まれています。私はあなたが答えを受け入れることができると信じているので、未回答の質問を探している他のメンバーはこれを見ません。 –

関連する問題