Loại vấn đề này được gọi là phân chia quan hệ .
Có hai giải pháp phổ biến:
-
Giải pháp đầu tiên xâu chuỗi các danh mục phù hợp lại với nhau và so sánh với một chuỗi cố định:
SELECT p2c.product_id FROM oc_product_to_category p2c GROUP BY p2c.product_id HAVING GROUP_CONCAT(p2c.category_id SEPARATOR ',' ORDER BY p2c.category_id) = '1,2'
-
Giải pháp thứ hai thực hiện
JOIN
cho mỗi giá trị bắt buộc:SELECT p.product_id FROM oc_product p INNER JOIN oc_product_to_category p2c1 ON (p.product_id = p2c1.product_id AND p2c1.category_id = 1) INNER JOIN oc_product_to_category p2c2 ON (p.product_id = p2c2.product_id AND p2c2.category_id = 2)
Tôi đề cập đến các giải pháp này trong bản trình bày của mình Mẫu truy vấn SQL, được tối ưu hóa . Tôi nhận thấy trong các thử nghiệm của mình rằng giải pháp kết hợp tốt hơn nhiều cho hiệu suất.
Đề xuất của @ Tom là đúng, đây là những gì sẽ trông như thế trong một truy vấn hoàn chỉnh:
SELECT p.product_id, GROUP_CONCAT(p2c3.category_id SEPARATOR ',') AS categories
FROM oc_product p
INNER JOIN oc_product_to_category p2c1
ON (p.product_id = p2c1.product_id AND p2c1.category_id = 1)
INNER JOIN oc_product_to_category p2c2
ON (p.product_id = p2c2.product_id AND p2c2.category_id = 2)
INNER JOIN oc_product_to_category p2c3
ON (p.product_id = p2c3.product_id)
GROUP BY p.product_id;
DISTINCT
mà @Tom gợi ý là không cần thiết, vì bảng p2c của bạn phải có ràng buộc DUY NHẤT đối với (product_id, category_id).