鉴于此数据:
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匹配第二个条件。
有一种有效的方法吗?
答案 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)