U zou hier voorwaardelijke aggregaties gebruiken. Voor Rood en Blauw wil je bijvoorbeeld kaarten vinden waar
- beide kleuren bestaan
- er bestaat geen andere kleur
Dat betekent dat als ik rood en blauw voor een kaart meet, ik er 2 moet krijgen. Als ik alle kleuren tel, moet ik ook 2 krijgen (hetzelfde voor één, drie of meer kleuren.)
Gebruik dus deze zoekopdracht en verander alleen de genoemde kleuren en het aantal kleuren:
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
);