在PostgreSQL JOIN查询中使用二进制逻辑

时间:2015-02-11 15:51:41

标签: sql postgresql

我有3张看起来像这样的表:

Users
----------
UserID
Name
Phone

User Groups
-----------
GroupID
Activity

Group Membership
---------------
UserID
GroupID

Independent Actives
-------------------
UserID
Activity

这个想法是用户可以作为小组的一部分或自己执行活动。我想做的是让所有参加某项活动的人回归。到目前为止我能够写的内容让我返回进行该活动的所有用户。我想要添加的是能够看到独立完成活动的人。这就是我到目前为止所做的:

SELECT                                                                   
users.name, users.phone, user_groups.activity  
FROM users 
INNER JOIN group_membership ON group_membership.userID = users.userID 
INNER JOIN user_groups ON user_groups.groupID = group_membership.groupID
WHERE user_groups.activity = 'Knitting';

上面的位工作正常,它显示所有用户都是编织的组,但我也希望它显示所有独立编织的用户。这是我试图添加的内容:

SELECT                                                                   
users.name, users.phone, user_groups.activity  
FROM users 
INNER JOIN group_membership ON group_membership.userID = users.userID 
INNER JOIN user_groups ON user_groups.groupID = group_membership.groupID
INNER JOIN independent_activity ON independent_activity.userID = users.userID
WHERE user_groups.activity = 'Knitting' OR independent_activity.activity = 'Knitting';

这里的问题是语法,我理解我正在尝试的算法,但我不知道如何将它转移到sql中,所以任何帮助都表示赞赏。

2 个答案:

答案 0 :(得分:0)

在这种情况下你可以使用UNION

SELECT users.NAME
    ,users.phone
    ,user_groups.activity
FROM users
INNER JOIN group_membership ON group_membership.userID = users.userID
INNER JOIN user_groups ON user_groups.groupID = group_membership.groupID
WHERE user_groups.activity = 'Knitting'

UNION

SELECT users.NAME
    ,users.phone
    ,independent_activity.activity
FROM users
INNER JOIN independent_activity ON independent_activity.userID = users.userID
WHERE independent_activity.activity = 'Knitting';

您还可能希望查找UNIONUNION ALL之间的差异,并根据您的要求来决定。

答案 1 :(得分:0)

你得到了SoulTrain的工作答案。但是,为了完整起见,我想提一下你不必加入所有这些表格。 (您可以在此处使用外部联接并删除与DISTINCT重复的匹配,但这不是必需的。您也不必两次查询用户表。并且您不需要UNION来执行此操作不同的工作。)

只需从要显示数据的一个表(即users表)中选择,然后使用EXISTS或IN来仅获取一组或另一组中的用户。

select name, phone
from users
where userid in
(
  select userid
  from independent_actives
  where activity = 'Knitting'
)
or userid
(
  select userid
  from group_membership
  where groupid in (select groupid from user_groups where activity = 'Knitting')
)