2017-07-30 96 views
1

获取数据我有这个表:userscontactsuser_providers,这是每一个结构:从那里PostgreSQL的

enter image description here

enter image description here

enter image description here

我想所有来自联系人表中的特定用户ID和user_providers中的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

查询犯规尊重PROVIDER_NAME,它只返回与特定用户ID相关联的所有联系人。

从存储的数据图片: contactsTable enter image description here user_provider表 enter image description here

我明白任何帮助!

+0

您的问题不清楚。第一个结果集大概是因为所有这些行都符合您的过滤条件而创建的。 –

+0

我将重新编辑这篇文章! –

+0

可以显示图片中3行的'provider_name'数据吗? – tima

回答

1

根据我的评论,您的查询得到正确的结果,因为表contactsuser_providersuser_id列之外没有其他关系。

而且由于user_id对于contacts表中的所有三行都是相同的,所以您将始终获得至少3行。你会得到的行数将是:number of contacts for specific user id * number of user providers for a specific user id

例如,做一个选择,而不在where子句中,让你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 

你能do是在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条件不是从查询明显。