我有这些表:users
contacts
和user_providers
,这是每个表的结构:
我想从联系人表中的特定用户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;
查询不遵守provider_name,它返回仅与特定用户ID相关的所有联系人。
来自存储数据的图片: 的 contactsTable user_provider表
我感谢任何帮助!
答案 0 :(得分:1)
根据我的评论,您获得了正确的查询结果,因为表格contacts
和user_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
您可以做的是在contacts
和user_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
条件在您的查询中并不明显。