Sie würden hier bedingte Aggregationen verwenden. Für Rot und Blau zum Beispiel möchten Sie Karten finden, wo
- beide Farben existieren
- es gibt keine andere Farbe
Das heißt, wenn ich Rot und Blau für eine Karte zähle, muss ich 2 bekommen. Wenn ich alle Farben zähle, muss ich auch 2 bekommen. (Das Gleiche gilt für eine, drei oder mehr Farben.)
Verwenden Sie also diese Abfrage und ändern Sie nur die genannten Farben und die Anzahl der Farben:
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
);