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 skal have en UNIQUE
indeks på (cat_id, product_id)
(i denne rækkefølge) for at dette virker hurtigt.
Denne løsning vil bruge INDEX FOR GROUP BY
for at få en liste over forskellige kategorier og EXISTS
prædikat vil være en lille smule hurtigere end COUNT(*)
(da sammenlægningen kræver nogle overhead).
Hvis du har mere end to produkter at søge efter, skal du justere det første argument til LIMIT
tilsvarende.
Det skal være LIMIT n - 1, 1
, hvor n
er antallet af elementer i IN
liste.
Opdatering:
For at returnere de kategorier, der indeholder alle produkter fra listen og intet andet, skal du bruge denne:
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)
)