2010-11-29 15 views
5

मैं इस तरह टेबल है:एक ही फ़ील्ड के साथ दो फ़ील्ड से एक फ़ील्ड में परिणाम कैसे जुड़ें?

Table1    Table2 
    name1 | link_id  name2 | link_id 
    text  1   text   2 
    text  2   text   4 

और मैं चाहता हूँ है परिणाम:

name1  name2  link_id 
text  text   1 
text  text   2 
text  text   4 

मैं यह कैसे कर सकते हैं?

जोड़ें: Sry, अच्छा नहीं में मेरी अंग्रेजी। मेरे पास डिवाइस, device_model और device_type टेबल हैं जो डुप्लिकेट फ़ील्ड counter_set_id के साथ हैं। मैं counter_set_id के सभी मूल्यों के साथ counter_set से फ़ील्ड का चयन करना चाहता हूं। मैं केवल counter_set_id क्षेत्रों

से मूल्यों को लाने की जरूरत है अब मैं इस प्रश्न हैं:

SELECT `dev`.`counter_set_id`, `mod`.`counter_set_id`, `type`.`counter_set_id` 
FROM `device` AS `dev` 
LEFT JOIN `device_model` AS `mod` ON `dev`.`device_model_id` = `mod`.`id` 
LEFT JOIN `device_type` AS `type` ON `mod`.`device_type_id` = `type`.`id` 
WHERE `dev`.`id` = 4; 

यह 3 कॉलम रिटर्न लेकिन मैं एक स्तंभ में सभी मूल्यों की आवश्यकता

इस अंतिम संस्करण है मुझे लगता है कि:

SELECT `dev`.`counter_set_id` 
FROM  `device` AS `dev` LEFT OUTER JOIN 
     `device_model` AS `mod` ON `dev`.`device_model_id` = `mod`.`id` 
WHERE `dev`.`id` = 4 AND 
     `dev`.`counter_set_id` IS NOT NULL 
UNION 
SELECT `mod`.`counter_set_id` 
FROM  `device_model` AS `mod` LEFT OUTER JOIN 
     `device` AS `dev` ON `mod`.`id` = `dev`.`device_model_id` 
WHERE `mod`.`counter_set_id` IS NOT NULL; 
+0

निश्चित रूप से name1 link_id = 4 के लिए शून्य होगा? इसके लिए कोई समान मूल्य नहीं है। – IamIC

उत्तर

7

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

Select name1, name2, A.link_id 
From table1 A Left Outer Join 
    table2 B on A.link_id = B.link_id 
Union 
Select name1, name2, link_id 
From table2 C Exception Join 
    table1 D on C.link_id = D.link_id 

तो अपने उत्पादन इस तरह होगा:

NAME1 NAME2 LINK_ID 
===== ===== ======= 
text <NULL>   1 
text text   2 
<NULL> text   4 
+0

धन्यवाद! मैं यही हूं आवश्यक! – VeroLom

+0

हम्म ... लेकिन मुझे लगता है कि MySQL एक्सेप्शन जॉइन का समर्थन नहीं करता = | – VeroLom

1

link_id 4 का नाम क्या है 1 के लिए? link_id 1 का नाम 2 के लिए क्या मूल्य है? तो खेद -

विभिन्न शामिल हों-प्रकार ऊपर देखने का प्रयास करें ..

http://dev.mysql.com/doc/refman/5.0/en/join.html

शायद मैं हाथ में प्रश्न गलत।

चियर्स

+0

श्रीमान, मेरी अंग्रेजी अच्छी नहीं है। मेरे पास 'device',' device_model' और 'device_type' टेबल डुप्लिकेट फ़ील्ड 'counter_set_id' है। मैं 'counter_set_id' के सभी मानों के साथ' counter_set' से फ़ील्ड का चयन करना चाहता हूं। मुझे केवल 'counter_set_id' फ़ील्ड से मूल्य प्राप्त करने की आवश्यकता है। – VeroLom

3

मैं यह सोचते कर रहा हूँ कि आप link_id मैदान पर शामिल हो रहे हैं। एक सामान्य जुड़ाव के परिणामस्वरूप चार पंक्तियां लौटाई जा रही हैं (जिनमें से दो समान हैं)। जो आप वास्तव में पूछ रहे हैं वह फ़ील्ड का संयोजन नहीं कर रहा है, लेकिन केवल अलग पंक्तियां प्राप्त कर रहा है। सबसे पहले

select distinct t1.name1, t2.name2, t1.link_id 
from Table1 as t1 
inner join Table2 as t2 
    on t1.link_id = t2.link_id 
+0

मुझे किसी अन्य तालिका से चुनने के लिए एक कॉलम में संयुक्त 'link_id' मानों (वास्तव में' counter_set_id') की आवश्यकता है (जहां 'आईडी' IN (<'counter_set_id' मान>); – VeroLom

3

मैं एक में शामिल होने के लिए काम करेंगे, लेकिन अब मुझे यकीन है कि नहीं कर रहा हूँ ... मैं किसी प्रकार की एक संघ सोच सोचा:

बस distinct कीवर्ड का उपयोग करें।

सभी ईमानदारी में यह एक खराब डिजाइन आईएमओ है।

select * from table1 
union 
select * from table2 
1

तो तीन कॉलम एक ही मूल्य है, बस

SELECT `type`.`counter_set_id` 
FROM ... 

या, बेहतर अभी तक, अगर वे एक ही मूल्य है, तो आप कर सकते हैं:

SELECT `dev`.`counter_set_id` 
FROM `device` AS `dev` 
WHERE `dev`.`id` = 4; 

अगर आप चाहते हैं उन्हें संयोजित करने के लिए (उन्हें सभी को एक ही क्षेत्र में रखें), इसका उपयोग करें:

SELECT CONCAT(
    CAST(`dev`.`counter_set_id` AS CHAR), 
    ',', 
    CAST(`mod`.`counter_set_id` AS CHAR), 
    ',', 
    CAST(`type`.`counter_set_id` AS CHAR)) 
FROM ... 
1

आप एक क्षेत्र परिणाम दोहराए जाते हैं, आपकी क्वेरी

के अंत में GROUP BY link_id का उपयोग आप केवल link_id क्षेत्र तो दिखाना चाहते हैं करने के लिए नहीं करना चाहते हैं:

SELECT DISTINCT ta.link_id 
FROM tblA AS ta 
INNER JOIN tblB AS tb 
ON ta.link_id = tb.link_id 

इसके अलावा CONCAT, CAST और अन्य के लिए देखो mysql मैनुअल पर उपयोगी फ्लेक्स मुझे उम्मीद है कि यह आपकी मदद करेगा।

1

सभी आईडी को एक अस्थायी तालिका में चुनें (हालांकि यह MySQL में काम करता है - SQL सर्वर में एक सीटीई), और इसे अपनी शामिल तालिका के रूप में उपयोग करें।

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