查找不在组织中的用户

时间:2011-10-17 15:10:19

标签: sql join

鉴于此数据:

users
  id    name
  ==    ====
  1     Alice
  2     Bob
  3     Carl

organizations
  id    name
  ==    ====
  1     Aaa
  2     Bbb

memberships
  id    organization_id   user_id
  ==    ===============   =======
  1     1                 1
  2     2                 1
  3     1                 2

我想找到不属于特定组织X的用户:

  • 根本没有会员记录的用户

  • 拥有会员记录的用户,但不适用于组织X.

例如,我希望用户不在组织2中。我期待:

users.id
========
2
3

尝试使用此连接无效:

SELECT *
FROM users left join memberships on memberships.user_id = users.id
where memberships.id is null or memberships.organization_id <> 1

它返回用户1,2,3因为1匹配第二个条件。

有一种有效的方法吗?

5 个答案:

答案 0 :(得分:2)

将您的JOIN限制为2的组织,然后测试null是实现您所需要的一种方式。

SELECT * 
FROM   users 
       LEFT JOIN memberships 
         ON memberships.user_id = users.id 
            AND memberships.organization_id = 2 
WHERE  memberships.id IS NULL 

您也可以使用NOT IN

SELECT * 
FROM   users 
WHERE id NOT IN (SELECT user_id from memberships where organization_id = 2 )

答案 1 :(得分:0)

select u.*
from users u
left join memberships m
on u.id = m.user_id
left join organizations o
on m.organization_id = o.id
where m.organization_id not in (2)

编辑:修改为包括所有用户

答案 2 :(得分:0)

您也可以使用减号运算符:

从用户中选择“名称” 减去 从用户中选择“名称”你的内部联接成员资格m在u.id = m.user_id内部联合组织o上m.organization_id = o.id和o。“name”='X'

答案 3 :(得分:0)

select Users.*
from users 
inner join memberships 
on Users.id = memberships.id
left join organizations 
on memberships.organization_id = organizations.id 
where memberships.id is null  AND memberships.organization_id = 2 

答案 4 :(得分:0)

这是使用exists子句的另一个选项:

 select * from users
 where not exists 
    (select memberships.id from memberships 
      inner join organizations on memberships.organization_id = organizations.id 
      and memberships.user_id = users.id
      where organizations.id = 2)