Użyłbyś tutaj agregacji warunkowych. Na przykład w przypadku czerwonego i niebieskiego chcesz znaleźć karty, w których
- oba kolory istnieją
- nie istnieje żaden inny kolor
Oznacza to, że jeśli policzę czerwony i niebieski jako kartę, muszę uzyskać 2. Jeśli policzę wszystkie kolory, muszę również uzyskać 2. (To samo dla jednego, trzech lub więcej kolorów).
Użyj więc tego zapytania i zmień tylko wymienione kolory i liczbę kolorów:
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
);