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)
)