SELECT cat_id
FROM (
SELECT DISTINCT cat_id
FROM cat_product
) cpo
WHERE EXISTS
(
SELECT NULL
FROM cat_product cpi
WHERE cpi.cat_id = cpo.cat_id
AND product_id IN (2, 3)
LIMIT 1, 1
)
UNIQUE
が必要です (cat_id, product_id)
のインデックス (この順序で)これが高速に機能するため。
このソリューションでは、INDEX FOR GROUP BY
を使用します 個別のカテゴリのリストを取得するには、EXISTS
述語はCOUNT(*)
よりも少し速くなります (集計にはある程度のオーバーヘッドが必要なため)
検索する商品が3つ以上ある場合は、最初の引数をLIMIT
に調整します。 それに応じて。
LIMIT n - 1, 1
である必要があります 、ここでn
IN
内のアイテムの数です リスト。
更新:
リストからすべての製品を保持し、他には何も保持していないカテゴリを返すには、次を使用します:
SELECT cat_id
FROM (
SELECT DISTINCT cat_id
FROM cat_product
) cpo
WHERE EXISTS
(
SELECT NULL
FROM cat_product cpi
WHERE cpi.cat_id = cpo.cat_id
AND product_id IN (2, 3)
LIMIT 1, 1
)
AND NOT EXISTS
(
SELECT NULL
FROM cat_product cpi
WHERE cpi.cat_id = cpo.cat_id
AND product_id NOT IN (2, 3)
)