2017-07-30 6 views
1

私はこのテーブル持っているWHEREからデータを取得します。userscontactsuser_providersを、これは各1の構造である:Postgresqlの

enter image description here

enter image description here

enter image description here

私はすべてを取得したいですコンタクトテーブル内の特定のユーザーIDとuser_provider内のuser_provider provider_nameからの連絡先、私はこのクエリを持っています

SELECT c.id, c.contact_name,c.description,c.discharge,c.latitude,c.longitude,c.town,c.country,c.province, 
    (SELECT array_agg(DISTINCT cn.number) FROM contact_numbers cn WHERE cn.contact_id = c.id) AS numbers, 
    (SELECT array_agg(DISTINCT ce.email) FROM contact_emails ce WHERE ce.contact_id = c.id) AS emails 
    FROM 
    contacts c, 
    user_providers po 
    WHERE 
    c.user_id = 1 and po.provider_name = 'google' 
    ORDER BY 
    c.id; 

しかし、イムは、それは次のように来てデータを取得しようとしたとき: enter image description here

クエリdoesntのはPROVIDER_NAMEを尊重し、それだけで特定のユーザーIDに関連したすべての連絡先を返します。保存されたデータから

画像: contactsTable enter image description here user_provider表 enter image description here

私は、任意の助けに感謝!

+0

質問が不明です。最初の結果セットは、すべての行がフィルタ条件と一致するため、おそらく作成されます。 –

+0

この投稿を再編集します! –

+0

画像にある3行の 'provider_name'データを表示できますか? – tima

答えて

1

テーブルcontactsとは、user_id列以外の関係を持っていないため、私のコメントでは正しい結果が得られています。

contactsテーブルの3つの行すべてで同じであるため、常に少なくとも3つの行が得られます。あなたが取得する行の数は次のようになります。たとえばnumber of contacts for specific user id * number of user providers for a specific user id

、選択を行っている句は、あなたを取得する場所でprovider_nameなし:3(連絡先)* 2(プロバイダ)とは何のことができます。

id contact_name provider_name 
------------------------------- 
1 Vacio   google 
2 Vacio2  google 
3 Vaciogiogle google 
1 Vacio   facebook 
2 Vacio2  facebook 
3 Vaciogiogle facebook 

contactsuser_providersテーブルの間に別の関係を作成してください。たとえば、provider_id列をcontactsテーブルに追加します。このテーブルでは、user_providersテーブルからプロバイダのIDを格納します。次に、以下のSQLを使用して表を結合し、実際にprovider_nameをフィルターに掛けることができます。

SELECT c.id, c.contact_name, up.provider_name 
FROM contacts c 
LEFT JOIN user_providers up ON c.provider_id = up.provider_id 
WHERE c.user_id = 1 AND up.provider_name = 'google'; 
0

テーブル間にJOINが必要です。単純なルール:は、FROM句にカンマを使用します。 常には、適切で明示的なJOIN構文を使用します。私は、これはあなたがこのような何かを探していると思い:

SELECT up.user_id, c.contact_name 
FROM contacts c JOIN 
    user_providers up 
    ON c.id = up.user_id 
WHERE up.user_id = 1 AND up.provider_name = 'facebook'  
ORDER BY up.user_id; 

しかし、JOIN条件は、クエリから明らかではありません。