2011-06-03 12 views
5

के बीच छेड़छाड़ ढूँढना मैं MySQL में एक ही तालिका में दो कॉलम के बीच (सेट) चौराहे खोजने की कोशिश कर रहा हूं। मैं मूल रूप से पंक्तियों है कि या तो एक col1 तत्व तालिका के col2, या एक col2 तत्व तालिका के col1 में है कि में है कि खोजना चाहते हैं।दो कॉलम

शुरू में मैंने कोशिश की:

SELECT * FROM table WHERE col1 IN (SELECT col2 FROM table) 

जो वाक्य रचना वैध था, फिर भी रन-टाइम अभी तक बहुत अधिक है। तालिका में पंक्तियों की संख्या ~ 300,000 है और प्रश्न में दो कॉलम अनुक्रमित नहीं हैं। मुझे लगता है कि रन टाइम या तो एन^2 या एन^3 है, इस पर निर्भर करता है कि MySQL तालिका के प्रत्येक तत्व के लिए फिर से उपकुंजी निष्पादित करता है या यदि यह अस्थायी रूप से सबक्वायरी का परिणाम संग्रहीत करता है।

अगला मैं दो स्तंभों के मिलन ले रहे हैं और अलग-अलग एलीमेंट को दूर करने के बारे में सोचा क्योंकि एक तत्व दिखाई देता है, तो अधिक एक बार इस संघ में तो यह दोनों स्तंभ में मौजूद रहा होगा की तुलना में (यह मानते हुए दोनों स्तंभ केवल विशिष्ट तत्व होते हैं) ।

क्या एक ही टेबल के दो कॉलम के बीच सेट चौराहे खोजने के लिए एक और अधिक सुरुचिपूर्ण (यानी तेज़) तरीका है? col1 और col2 पर

+0

का उपयोग कभी नहीं 'का चयन करें मेज से एक्स कहां Coly में (का चयन करें ...)' 'में (SELECT' क्वेरी नरक के रूप में धीमा है MySQL में, हमेशा @joe – Johan

उत्तर

11
SELECT t1.* 
    FROM table t1 
     INNER JOIN table t2 
      ON t1.col1 = t2.col2 

बनाना अनुक्रमित इस प्रश्न के रूप में अच्छी तरह से मदद करने के लिए एक लंबा रास्ता तय करेगा।

+0

द्वारा दिखाए गए आंतरिक जुड़ने का उपयोग करें, यह बहुत अच्छा काम करता है, धन्यवाद! और यह पता चला कि कॉलम में से एक ** ** सूचकांक था: डी – alott

-1

आप केवल मान चाहते हैं, INTERSECT आदेश का प्रयास करें:

(SELECT col1 FROM table) INTERSECT (SELECT col2 FROM table) 
संबंधित मुद्दे