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
)
Anda harus memiliki UNIQUE indeks di (cat_id, product_id) (dalam urutan ini) agar ini bekerja dengan cepat.
Solusi ini akan menggunakan INDEX FOR GROUP BY untuk mendapatkan daftar kategori yang berbeda, dan EXISTS predikat akan sedikit lebih cepat dari COUNT(*) (karena agregasi memerlukan beberapa overhead).
Jika Anda memiliki lebih dari dua produk untuk dicari, sesuaikan argumen pertama ke LIMIT sesuai.
Seharusnya LIMIT n - 1, 1 , di mana n adalah jumlah item dalam IN daftar.
Pembaruan:
Untuk mengembalikan kategori yang menahan semua produk dari daftar dan tidak ada yang lain, gunakan ini:
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)
)