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