Запрос с исключением 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
  1. Объединим обе таблицы в одну результирующую с нужными полями через LEFT JOIN
  2. На полученный результат наложим фильтр 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
→ Ссылка