Тук бихте използвали условни агрегации. За червено и синьо например искате да намерите карти, където
- и двата цвята съществуват
- не съществува друг цвят
Това означава, че ако преброя червено и синьо за карта, трябва да получа 2. Ако преброя всички цветове, трябва да получа и 2. (Същото за един, три или повече цвята.)
Затова използвайте тази заявка и променете само споменатите цветове и броя на цветовете:
select *
from cards_data where id in
(
select cards_id
from con_cards_colors
group by cards_id
having count(case when colors_id in (select id from colors where name in ('Red','Blue')) then 1 end) = 2 -- i.e. find all
and count(*) = 2 -- i.e. find only those and no others
);