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
)
Musíte mít UNIQUE
index na (cat_id, product_id)
(v tomto pořadí), aby to fungovalo rychle.
Toto řešení bude používat INDEX FOR GROUP BY
získáte seznam různých kategorií a EXISTS
predikát bude o něco rychlejší než COUNT(*)
(protože agregace vyžaduje určitou režii).
Pokud máte hledat více než dva produkty, upravte první argument na LIMIT
podle toho.
Mělo by být LIMIT n - 1, 1
, kde n
je počet položek v IN
seznam.
Aktualizace:
Chcete-li vrátit kategorie obsahující všechny produkty ze seznamu a nic jiného, použijte toto:
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)
)