Я пытаюсь обернуть мозг вокруг этого, используя объединения, подзапросы, не существующие предложения, и я не могу придумать запрос, который дает правильные результаты.
Таблица A - ИДЕНТИФИКАТОР ПЕРВИЧНОГО (не относится к этой проблеме)
id | campaign_id | user_id
--------------------------
1 1 1
2 1 2
3 0 3
4 2 3
5 1 2
Таблица B - UNIQUE campaign_id + user_id
campaign_id | user_id | admin
-----------------------------
1 1 1
1 2 0
1 3 0
2 3 0
Мне нужно найти экземпляры таблицы B, в которых пользователь больше не имеет записи в таблице A, которые соответствуют элементу campaign_id в таблице B. Таблица A является основным содержанием, и они могут иметь несколько записей таблицы A, которые присутствуют в кампания. Таблица B является таблицей-членом, которая указывает, что они являются участниками кампании и являются ли они администратором или нет. Кроме того, они могут иметь вход в таблице B в качестве администратора, но не иметь записи в таблице A, поэтому запрос должен проверять на admin = 0.
В записях примера неверной записью в таблице B будет campaign_id 1, user_id 3
Используйте внешнее соединение, а затем укажите в предложении where
, что внешняя объединенная таблица user_id
имеет значение null:
select tblB.*
from tblB
left join tblA
on tblA.campaign_id = tblB.campaign_id
and tblA.user_id = tblB.user_id
where tblB.admin = 0
and tblA.user_id is null