2012-12-23 10 views
6

बस की सुविधा देता है कहते हैं कि के रूप मेंMySQL: एक बयान में 2 कॉलम के परिणामों का मेल

R1  R2 
| 1 |  | 5 | 
| 2 |  | 6 | 
| 3 |  | 7 | 
| 4 |  | 8 | 

इस प्रकार मैं 2 परिणाम सेट है मैं एक ही सेट में इन परिणाम गठबंधन करने के लिए की जरूरत है, तो मैं की तरह कुछ होगा इस:

R3 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 

वर्तमान में, मैं बहुत की तरह आ यूनिअन के साथ इस कर रहा हूँ:

SELECT c_1 AS result FROM table WHERE c_1=3 OR c_2=3 
UNION 
SELECT c_2 AS result FROM table WHERE c_1=3 OR c_2=3 

असल में, मैं तालिका पर दो बार एक ही ऑपरेशन कर रहा हूं, हर बार अलग पंक्तियों को पुनः प्राप्त करना। क्या ऐसा करने के लिए मैं और अधिक कुशल तरीका कर सकता हूं? मुझे परिणाम को एक कॉलम में चाहिए क्योंकि यह IN की सीमा है। लंबे समय में, मैं क्या करने की जरूरत है इस

SELECT name FROM person WHERE person_id IN 
(SELECT c_1 AS result FROM table WHERE c_1=3 OR c_2=3 
UNION 
SELECT c_2 AS result FROM table WHERE c_1=3 OR c_2=3) 

है वहाँ यह सब खोजने के बारे में जाने के लिए एक बेहतर तरीका है? किसी भी और सभी मदद का स्वागत है।

+0

एसक्यूएल एक INNER JOIN प्रदर्शन कर सकते हैं वांछित परिणाम, नहीं गणना पद्धति की घोषणा की। इसके लिए 'EXPLAIN' –

+0

कमांड का उपयोग करें, क्या आप' SELECT c_1 को r1, c_2 के रूप में r2 के रूप में उपयोग नहीं कर सकते ... '? साथ ही, क्या आप 'परिणाम' चर का उपयोग कर रहे हैं? – bozdoz

+0

व्यक्तिगत रूप से जब भी संभव हो मैं आईएन का उपयोग करने से बचता हूं, जब तक कि मुझे पता न हो कि यह हमेशा एक छोटी सी तालिका में एक छोटा सा सेट होगा। 'आंतरिक शामिल' का उपयोग करके माइकल बर्कोस्की का जवाब मेरा पसंदीदा तरीका है। बस सुनिश्चित करें कि आपके पास चाबियों के रूप में उपयोग करने के लिए इच्छित सभी चीज़ों पर अनुक्रमणिका है या प्रदर्शन के लिए उचित विदेशी कुंजी सेट अप करें। – Levi

उत्तर

6
IN() सबक्वेरी के बजाय

, आप पर या तोc_1 OR c_2

SELECT 
    name 
FROM 
    person 
    /* Join against the other table on *either* column c_1 or c_2 */ 
    INNER JOIN `table` ON `table`.c_1 = person.person_id OR `table`.c_2 = person.person_id 
WHERE 
    /* And the WHERE condition only needs to be applied once */ 
    c_1 = 3 OR c_2 = 3 

http://sqlfiddle.com/#!2/4d159/1

+2

अच्छी चीजें! एक जादू की तरह काम करता है। –

+1

@ ग्रेऑन ग्रेट - मदद करने में खुशी, और स्टैक ओवरफ़्लो में आपका स्वागत है। –

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