Учитывая эти данные:
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 соответствует второму условию.
Есть ли эффективный способ сделать это?