Запрос с исключением SQL из двух таблиц
есть две таблицы:
api_task
id | count
1 | 1
2 | 2
3 | 3
4 | 2
5 | 1
и
api_task_user
id | id_task | id_user
1 | 1 | 1
2 | 2 | 1
3 | 3 | 2
Допустим id_user = 1
В результате нужно получить id из api_task всех заданий, кроме тех, где в api_task_user id_user = 1
В результате должно быть так:
api_task
id | count
3 | 3
4 | 2
5 | 1
Если мои догадки верны, то нужно использовать:
SELECT at.*
FROM api_task at
WHERE
NOT EXISTS (SELECT *
FROM api_task_user
WHERE api_task_user.user_id = 1
);
Но, увы, это решение не работает.
UPD:
SELECT at.id,atu.user_id FROM api_task at LEFT JOIN api_task_user atu ON at.id = atu.id_task
Выдаёт:
id | user_id
1 | 1
2 | 1
3 | NULL
Такой запрос:
SELECT at.id,atu.user_id FROM api_task at LEFT JOIN api_task_user atu ON at.id = atu.id_task WHERE atu.user_id != 1
Вообще ничего не выдаёт.
Ответы (2 шт):
Автор решения: santavital
→ Ссылка
- Объединим обе таблицы в одну результирующую с нужными полями через
LEFT JOIN - На полученный результат наложим фильтр
WHERE
Автор решения: HackerU
→ Ссылка
Подобная задача достаточно часто решается с помощью left join. Мы получаем выборку, где у всех записей таблицы api_task, у которых нет пары по условию join в поле b.id пустое значение (null). Таким образом после join мы можем проверить условие b.id is null и получить желаемый результат.
p.s. синтаксис sqlite
select a.*
from api_task as a
left join api_task_user as b
on a.id = b.id
and b.id_user = 1
where b.id is null