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
)
Je moet een UNIQUE
. hebben index op (cat_id, product_id)
(in deze volgorde) om dit snel te laten werken.
Deze oplossing gebruikt INDEX FOR GROUP BY
om een lijst met verschillende categorieën te krijgen, en EXISTS
predikaat zal iets sneller zijn dan COUNT(*)
(aangezien de aggregatie enige overhead vereist).
Als u meer dan twee producten moet zoeken, pas dan het eerste argument aan tot LIMIT
dienovereenkomstig.
Het moet LIMIT n - 1, 1
. zijn , waarbij n
is het aantal items in de IN
lijst.
Bijwerken:
Gebruik dit om de categorieën terug te sturen die alle producten van de lijst bevatten en niets anders:
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)
)