यह संबंधपरक विभाजन का मामला है:
SELECT c.id, c.name
FROM components_componentproperty cp1
JOIN components_componentproperty cp2 USING (component_id)
JOIN components_component c ON c.id = cp1.component_id
WHERE cp1.property_id = 9102 AND cp1.value IN ('4015', '4016')
AND cp2.property_id = 8801 AND cp2.value = '3'
AND c.type_id = 3832
GROUP BY c.id;
हमने यहां प्रासंगिक तकनीकों का एक शस्त्रागार इकट्ठा किया है:
बड़ी संख्या में प्रॉपर्टी की जांच करें
आप उपरोक्त क्वेरी का विस्तार कर सकते हैं और गुणों से भरे हाथ के लिए यह सबसे तेज़ संभव समाधानों में से एक होगा। बड़ी संख्या के लिए इस मार्ग पर जाना अधिक सुविधाजनक (और तेज़ होना भी शुरू) होगा:
5 संपत्तियों के लिए उदाहरण, आवश्यकतानुसार विस्तृत करें:
SELECT c.id, c.name
FROM (
SELECT id
FROM (
SELECT component_id AS id, property_id -- alias id just to shorten syntax
FROM components_componentproperty
WHERE property_id IN (9102, 8801, 1234, 5678, 9876) -- expand as needed
GROUP BY 1,2
) cp1
GROUP BY 1
HAVING count(*) = 5 -- match IN expression
) cp2
JOIN components_component c USING (id);
आंतरिक सबक्वेरी का अतिरिक्त चरण cp1
केवल आवश्यक है, क्योंकि आपके पास स्पष्ट रूप से प्रति (component_id, property_id)
में एकाधिक प्रविष्टियां हैं components_componentproperty
. में . हम कर सकते थे गुना cp1
और cp2
एक में और जांचें
HAVING count(DISTINCT property_id) = 5
लेकिन मुझे उम्मीद है कि यह अधिक महंगा होगा, क्योंकि count(DISTINCT col)
प्रति पंक्ति one एक प्रकार के ऑपरेशन की आवश्यकता है ।
बहुत लंबी सूचियों के लिए IN
एक बुरा विकल्प है। विचार करें: