从WHERE Postgresql获取数据

时间:2017-07-30 23:20:21

标签: sql postgresql where

我有这些表:users contactsuser_providers,这是每个表的结构:

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

我感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

根据我的评论,您获得了正确的查询结果,因为表格contactsuser_providers没有user_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

您可以做的是在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';

答案 1 :(得分: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条件在您的查询中并不明显。