इस प्रकार की समस्या को संबंधपरक विभाजन . कहा जाता है ।
दो सामान्य समाधान हैं:
-
पहला समाधान मेल खाने वाली श्रेणियों को एक साथ जोड़ता है और एक निश्चित स्ट्रिंग से तुलना करता है:
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'
-
दूसरा समाधान एक
JOIN
करता है प्रत्येक आवश्यक मान के लिए: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)
मैं अपनी प्रस्तुति में इन समाधानों को शामिल करता हूं SQL क्वेरी पैटर्न, अनुकूलित . मैंने अपने परीक्षणों में पाया कि शामिल होने का समाधान प्रदर्शन के लिए बहुत बेहतर है।
@ टॉम का सुझाव सही है, यहाँ एक पूरी क्वेरी में यह कैसा दिखेगा:
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
कि @Tom सुझाव आवश्यक नहीं होना चाहिए, क्योंकि आपकी p2c तालिका में एक UNIQUE बाधा (product_id, category_id) होनी चाहिए।