Sql 查找不在组织中的用户
鉴于这些数据:Sql 查找不在组织中的用户,sql,join,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
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
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
选择*
从用户左侧加入memberships.user_id=users.id上的成员身份
其中memberships.id为null或memberships.organization\u id为1
它返回用户1,2,3,因为1在第二个where条件上匹配
有没有一种有效的方法可以做到这一点?将您的加入限制为2人组织,然后测试null是实现您想要的目标的一种方法,例如
SELECT *
FROM users
LEFT JOIN memberships
ON memberships.user_id = users.id
AND memberships.organization_id = 2
WHERE memberships.id IS NULL
您也可以在
SELECT *
FROM users
WHERE id NOT IN (SELECT user_id from memberships where organization_id = 2 )
编辑:修改为包括所有用户您还可以使用减号集运算符: 从用户中选择“名称” 减
从用户u内部加入成员m on u.id=m.user\u id内部加入组织o on m.organization\u id=o.id和o中选择“name”=“name”=“X”下面是使用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)
这似乎不包括完全没有会员资格的用户。@jemminger尝试修改后的查询。谢谢,花了一些时间摸索,但我现在明白了!
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
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)