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
)
Musisz mieć UNIQUE
indeks na (cat_id, product_id)
(w tej kolejności), aby to działało szybko.
To rozwiązanie użyje INDEX FOR GROUP BY
aby uzyskać listę różnych kategorii i EXISTS
predykat będzie trochę szybszy niż COUNT(*)
(ponieważ agregacja wymaga trochę narzutu).
Jeśli masz więcej niż dwa produkty do wyszukania, dostosuj pierwszy argument do LIMIT
odpowiednio.
Powinno to być LIMIT n - 1, 1
, gdzie n
to liczba pozycji w IN
lista.
Aktualizacja:
Aby zwrócić kategorie zawierające wszystkie produkty z listy i nic więcej, użyj tego:
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)
)