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
)
Bạn cần có UNIQUE lập chỉ mục trên (cat_id, product_id) (theo thứ tự này) để việc này hoạt động nhanh chóng.
Giải pháp này sẽ sử dụng INDEX FOR GROUP BY để nhận danh sách các danh mục riêng biệt và EXISTS vị từ sẽ nhanh hơn một chút so với COUNT(*) (vì việc tổng hợp yêu cầu một số chi phí).
Nếu bạn có nhiều hơn hai sản phẩm để tìm kiếm, hãy điều chỉnh đối số đầu tiên thành LIMIT theo đó.
Nó phải là LIMIT n - 1, 1 , ở đâu n là số mục trong IN danh sách.
Cập nhật:
Để trả lại các danh mục chứa tất cả các sản phẩm từ danh sách và không có gì khác, hãy sử dụng tùy chọn này:
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)
)