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
)
Du måste ha en UNIQUE
index på (cat_id, product_id)
(i denna ordning) för att detta ska fungera snabbt.
Denna lösning kommer att använda INDEX FOR GROUP BY
för att få en lista över distinkta kategorier och EXISTS
predikatet kommer att vara lite snabbare än COUNT(*)
(eftersom aggregeringen kräver viss overhead).
Om du har mer än två produkter att söka efter, justera det första argumentet till LIMIT
i enlighet därmed.
Det ska vara LIMIT n - 1, 1
, där n
är antalet objekt i IN
lista.
Uppdatering:
För att returnera kategorierna som innehåller alla produkter från listan och inget annat, använd detta:
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)
)