私は実際にこれを機能させることができましたが、グルがより最適なアプローチを提供できるかどうか疑問に思っていました:
SELECT `cfc`.`card_face_id`
FROM `card_face_color` AS `cfc`
INNER JOIN `color` AS `c` ON c.color_id = cfc.color_id
WHERE c.c_url IN ('black', 'blue')
AND card_face_id NOT IN (
SELECT `cfc`.`card_face_id`
FROM `card_face_color` AS `cfc`
INNER JOIN `color` AS `c` ON cfc.color_id = c.color_id
WHERE c.c_url NOT IN ('black', 'blue')
)
GROUP BY `cfc`.`card_face_id`
HAVING (COUNT(DISTINCT c.c_url) = 2)
基本的に、黒と青を含むすべての card_faces を選択しようとしていますが、他の色は含まれていません (各 card_face は最大 5 つまで可能です)。内部結合を使用して実行しようとしましたが、これは 25 倍近く遅くなりました。私は自分のインデックスにかなり満足しています。私は、Having 句の経験が浅いだけです。
アップデート
クエリに対して実行EXPLAIN
すると、これが明らかになります(フォーマットについてはお詫びします)。
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY c index PRIMARY,c_url c_url 50 NULL 10 Using where; Using index; Using temporary; Using filesort
1 PRIMARY cfc ref color_id color_id 1 site.co.uk.c.color_id 1156 Using where; Using index
2 SUBQUERY c range PRIMARY,c_url c_url 50 NULL 9 Using where; Using index
2 SUBQUERY cfc ref color_id color_id 1 site.co.uk.c.color_id 1156 Using index