I have the following two tables.
attempts:
id 40 41 42 43
attempt_tags:
id attemptid tagid 1 40 2 2 42 4 3 40 11 4 43 10 5 44 2
I’m looking to select a record from the attempts table where (for example) tagid 2 and 11 are BOTH not present, so the result of the query in this example would return everything except for id 40.
I initially thought this question would be a good solution, but I’m not as convinced now, I imagine in the scenario where I need to select the results that don’t have many tagid‘s present (e.g. 2, 11, 15, 18, 20, 25 etc), this query would end up getting quite long.
I’m sure there’s a simple solution, but I’m just not seeing it at the moment.
Advertisement
Answer
One method uses not exists, twice:
select a.*
from attempts a
where not exists (select 1
from attempt_tags att
where att.attemptid = a.id and
att.tagid = 2
) and
not exists (select 1
from attempt_tags att
where att.attemptid = a.id and
att.tagid = 11
) ;
EDIT:
You can also simplify this to:
select a.*
from attempts a
where not exists (select 1
from attempt_tags att
where att.attemptid = a.id and
att.tagid in (2, 11)
) ;