m2m 関係: items-categoriesを考えると、3 つのテーブルがあります。
- アイテム,
- カテゴリーと
- 両方への参照を保持するitems_categories
指定されたすべてのカテゴリセットに属するアイテムを見つけたい:
Find Item
belonging to a category in [1,3,6]
and belonging to a category in [7,8,4]
and belonging to a category in [12,66,42]
and ...
mySQL でこれを実現するには、2 つの方法が考えられます。
オプション A: 内部結合:
SELECT id from items
INNER JOIN category c1 ON (item.id = c1.item_id)
INNER JOIN category c2 ON (item.id = c2.item_id)
INNER JOIN category c3 ON (item.id = c3.item_id)
...
WHERE
c1.category_id IN [1,3,6] AND
c2.category_id IN [7,8,4] AND
c3.category_id IN [12,66,42] AND
...;
オプション B: 存在する:
SELECT id from items
WHERE
EXISTS(SELECT category_id FROM category WHERE category.item_id = id AND category_id in [1,3,6] AND
EXISTS(SELECT category_id FROM category WHERE category.item_id = id AND category_id in [7,8,4] AND
EXISTS(SELECT category_id FROM category WHERE category.item_id = id AND category_id in [12,66,42] AND
...;
どちらのオプションも機能します。質問は次のとおりです。大きな項目テーブルで最も高速/最適なのはどれですか? または、欠落している OPTION CI がありますか?