2009-07-21 11 views
5

मैं उप-क्वेरी के रूप में संघ का उपयोग करके एक क्वेरी को अनुकूलित करना चाहता हूं। मैं वास्तव में यह सुनिश्चित नहीं करता कि क्वेरी कैसे बनाएं।उप-प्रश्न के रूप में संघ MySQL

SELECT Parts.id 
FROM Parts_Category, Parts 
    LEFT JOIN Image ON Parts.image_id = Image.id 
WHERE 
( 
    (
     Parts_Category.category_id = '508' OR 
     Parts_Category.main_category_id ='508' 
    ) AND 
    Parts.id = Parts_Category.Parts_id 
) AND 
Parts.status = 'A' 
GROUP BY 
    Parts.id 

मुझे क्या करना चाहते हैं तो नीचे दिए गए संघ के साथ इस ((Parts_Category.category_id = '508' OR Parts_Category.main_category_id ='508') भाग की जगह है: मैं MYSQL 5

उपयोग कर रहा हूँ यहाँ मूल प्रश्न है। इस तरह मैं ग्रुप बाय क्लॉज को छोड़ सकता हूं और सीधे कॉल इंडेक्स का उपयोग कर सकता हूं जो प्रदर्शन में सुधार करना चाहिए। पार्ट्स और पार्ट्स श्रेणी सारणी में आधे मिलियन रिकॉर्ड होते हैं, इसलिए कोई भी लाभ बहुत अच्छा होगा।

(
    SELECT * FROM 
    (
     (SELECT Parts_id FROM Parts_Category WHERE category_id = '508') 
     UNION 
     (SELECT Parts_id FROM Parts_Category WHERE main_category_id = '508') 
    ) 
    as Parts_id 
) 

किसी को भी मुझे कैसे इसे फिर से लिखने के लिए पर एक सुराग दे सकते हैं? मैंने घंटों तक कोशिश की है लेकिन इसे प्राप्त नहीं कर सकता क्योंकि मैं केवल MySQL के लिए बिल्कुल नया हूं।

उत्तर

4
SELECT Parts.id 
FROM (
     SELECT parts_id 
     FROM Parts_Category 
     WHERE Parts_Category.category_id = '508' 
     UNION 
     SELECT parts_id 
     FROM Parts_Category 
     WHERE Parts_Category.main_category_id = '508' 
     ) pc 
JOIN Parts 
ON  parts.id = pc.parts_id 
     AND Parts.status = 'A' 
LEFT JOIN 
     Image 
ON  image.id = parts.image_id 

नोट MySQLIndex Merge का उपयोग करें और आप इस के रूप में आपकी क्वेरी पुनर्लेखन कर सकते हैं कर सकते हैं कि:

SELECT Parts.id 
FROM (
     SELECT DISTINCT parts_id 
     FROM Parts_Category 
     WHERE Parts_Category.category_id = '508' 
       OR Parts_Category.main_category_id = '508' 
     ) pc 
JOIN Parts 
ON  parts.id = pc.parts_id 
     AND Parts.status = 'A' 
LEFT JOIN 
     Image 
ON  image.id = parts.image_id 

है, जो और अधिक कुशल यदि आप निम्न अनुक्रमित है हो जाएगा:

Parts_Category (category_id, parts_id) 
Parts_Category (main_category_id, parts_id) 
+0

धन्यवाद कभी बहुत क्वास्नोई। 62,000 पंक्ति श्रेणी पर FY1 क्वेरी 1 सेकंड तेज हो जाती है! – gus

+0

मुझे लगता है कि आपके दूसरे उदाहरण में मुझे पार्ट्स द्वारा समूह को जोड़ना होगा। क्योंकि मैं डुप्लिकेट नहीं चाहता हूं जहां एक भाग अन्य श्रेणियों में सूचीबद्ध हो। संघ का उपयोग करने के पीछे यही विचार था। मैं वैसे भी प्रदर्शन की तुलना करूंगा। एक बार फिर धन्यवाद। – gus

+0

ग्रुप बाय को दूसरे उदाहरण में जरूरी था और यदि जोड़ा गया तो मुझे एक ही समस्या मिलती है - फाइलॉर्ट और स्पष्टीकरण से अस्थायी का उपयोग करना। – gus

संबंधित मुद्दे