Useresti le aggregazioni condizionali qui. Per il Rosso e il Blu, ad esempio, vuoi trovare le carte dove
- Esistono entrambi i colori
- non esiste altro colore
Ciò significa che se conto Rosso e Blu per una carta devo ottenere 2. Se conto tutti i colori devo anche ottenere 2. (Lo stesso per uno, tre o più colori.)
Quindi usa questa query e cambia solo i colori menzionati e il numero di colori:
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
);