Usarías agregaciones condicionales aquí. Para Red y Blue, por ejemplo, desea encontrar tarjetas donde
- ambos colores existen
- no existe otro color
Eso significa que si cuento rojo y azul para una tarjeta, debo obtener 2. Si cuento todos los colores, también debo obtener 2. (Lo mismo para uno, tres o más colores).
Entonces use esta consulta y solo cambie los colores mencionados y la cantidad de colores:
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
);