0

我有三个表:userscontactsgroups。我想找到一个用户的所有联系人,然后从那些选定的联系人中,我想排除那些group_idgroups表中找到特定的用户的联系人。

我的groups表结构如下:

id (primary key)
group_id (a foreign key to a table contain general group info)
user_id (a foreign key to the users table)

我的contacts表结构如下:

id (primary key)
user_id (a foreign key to the `users` table of the user who added the contact)
contact_id (a foreign key to the `users` table of the added contact)

我当前不工作的查询是这样的:

"""SELECT c.*, u.*
   FROM contacts c
       LEFT JOIN groups g ON c.contact_id = g.user_id
       INNER JOIN users u on u.id = c.contact_id
   WHERE c.user_id = %s AND
       <not sure what further constraints to place on query>""", (user_id, group_id)

根据我的理解,LEFT JOIN当然是不正确的,鉴于它不正确,我还没有在WHERE子句中添加任何更多的约束。

实现这一目标的最佳方法是什么?谢谢你。

4

1 回答 1

1

假设LEFT JOIN是正确的并且您想要包括不属于任何组的联系人,您可以尝试以下查询:

select 
    c.*,
    u.*
from users u
    join contacts c
        on u.id = c.user_id
    left join groups g
        on c.contact_id = g.user_id
where
    c.user_id = %s
    and g.group_id not in (<your groups here>)

您的组列表将是逗号分隔的标识符列表。我不知道 PostgreSQL python 驱动程序是否包含任何可以轻松格式化它的函数,但这就是想法。

要在评论中回答您的次要问题(如何获取没有组的联系人和排除组中的联系人),您可能需要使用联合:

select 
    c.*,
    u.*
from users u
    join contacts c
        on u.id = c.user_id
    left join groups g
        on c.contact_id = g.user_id
where
    c.user_id = %s
    and g.group_id is null
union
select 
    c.*,
    u.*
from users u
    join contacts c
        on u.id = c.user_id
    join groups g
        on c.contact_id = g.user_id
where
    c.user_id = %s
    and g.group_id = %d
于 2013-11-12T19:03:18.087 回答