2009-12-24 7 views
10

मेरे पास एक सारणी है जो अन्य टेबलों में 3 विदेशी कुंजी का उपयोग करती है। जब मैं बाएं जुड़ता हूं, तो मुझे डुप्लिकेट कॉलम मिलते हैं। MySQL का कहना है कि USING वाक्यविन्यास डुप्लिकेट कॉलम को कम करेगा, लेकिन कई कुंजी के लिए उदाहरण नहीं हैं।MySQL: बाएं जुड़ने पर डुप्लिकेट कॉलम को हटाकर, 3 टेबल

को देखते हुए:

mysql> describe recipes; 
+------------------+------------------+------+-----+---------+-------+ 
| Field   | Type    | Null | Key | Default | Extra | 
+------------------+------------------+------+-----+---------+-------+ 
| ID_Recipe  | int(11)   | NO | PRI | NULL |  | 
| Recipe_Title  | char(64)   | NO |  | NULL |  | 
| Difficulty  | int(10) unsigned | NO |  | NULL |  | 
| Elegance   | int(10) unsigned | NO |  | NULL |  | 
| Quality   | int(10) unsigned | NO |  | NULL |  | 
| Kitchen_Hours | int(10) unsigned | NO |  | NULL |  | 
| Kitchen_Minutes | int(10) unsigned | NO |  | NULL |  | 
| Total_Hours  | int(10) unsigned | NO |  | NULL |  | 
| Total_Minutes | int(10) unsigned | NO |  | NULL |  | 
| Serving_Quantity | int(10) unsigned | NO |  | NULL |  | 
| Description  | varchar(128)  | NO |  | NULL |  | 
| ID_Prep_Text  | int(11)   | YES |  | NULL |  | 
| ID_Picture  | int(11)   | YES |  | NULL |  | 
| Category   | int(10) unsigned | NO |  | NULL |  | 
| ID_Reference  | int(11)   | YES |  | NULL |  | 
+------------------+------------------+------+-----+---------+-------+ 
15 rows in set (0.06 sec) 

mysql> describe recipe_prep_texts; 
+------------------+---------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+------------------+---------------+------+-----+---------+-------+ 
| ID_Prep_Text  | int(11)  | NO | PRI | NULL |  | 
| Preparation_Text | varchar(2048) | NO |  | NULL |  | 
+------------------+---------------+------+-----+---------+-------+ 
2 rows in set (0.02 sec) 

mysql> describe recipe_prep_texts; 
+------------------+---------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+------------------+---------------+------+-----+---------+-------+ 
| ID_Prep_Text  | int(11)  | NO | PRI | NULL |  | 
| Preparation_Text | varchar(2048) | NO |  | NULL |  | 
+------------------+---------------+------+-----+---------+-------+ 
2 rows in set (0.02 sec) 

mysql> describe mp_references; 
+--------------+---------+------+-----+---------+-------+ 
| Field  | Type | Null | Key | Default | Extra | 
+--------------+---------+------+-----+---------+-------+ 
| ID_Reference | int(11) | NO | PRI | NULL |  | 
| ID_Title  | int(11) | YES |  | NULL |  | 
| ID_Category | int(11) | YES |  | NULL |  | 
+--------------+---------+------+-----+---------+-------+ 
3 rows in set (0.00 sec) 

मेरे क्वेरी बयान:

SELECT * 
FROM Recipes 
LEFT JOIN (Recipe_Prep_Texts, Recipe_Pictures, mp_References) 
ON (
Recipe_Prep_Texts.ID_Prep_Text = Recipes.ID_Prep_Text AND 
Recipe_Pictures.ID_Picture = Recipes.ID_Picture AND 
mp_References.ID_Reference = Recipes.ID_Reference 
); 

मेरे उद्देश्य डुप्लिकेट कॉलम बिना शामिल से सभी स्तंभों में से एक पंक्ति पाने के लिए है। मैं SQL कथन भेजने और परिणाम सेट पुनर्प्राप्त करने के लिए MySQL C++ कनेक्टर का उपयोग कर रहा हूं। मेरा मानना ​​है कि सी ++ कनेक्टर में डुप्लिकेट कॉलम नामों के साथ समस्याएं हैं।

तो एसक्यूएल कथन वाक्यविन्यास क्या है जिसका मुझे उपयोग करना चाहिए?

Reference to MySQL JOIN syntax

उत्तर

13

मेरा मानना ​​है कि निम्नलिखित काम करना चाहिए:

SELECT * 
FROM Recipes 
LEFT JOIN Recipe_Prep_Texts USING (ID_Prep_Text) 
LEFT JOIN Recipe_Pictures USING (ID_Picture) 
LEFT JOIN mp_References USING (ID_Reference) 
+2

यह काम करता है, सिवाय इसके कि जब तालिका मौजूद नहीं है। तो मैंने इसके लिए चेक डाला। साथ ही, यह मानता है कि तालिकाओं में विदेशी कुंजी फ़ील्ड को छोड़कर अद्वितीय कॉलम नाम हैं। सौभाग्य से, मेरे पास यही है। **बहुत धन्यवाद!** –

2

आप संयुक्त जिसके परिणामस्वरूप तालिका से चयन कर रहे हैं *। उस सीमा को सीमित करें * जो भी कॉलम आप रखना चाहते हैं।

+1

आप MySQL से पोस्ट डेटा में देखने के रूप में, मैं कॉलम की एक बहुत कुछ है। अगर मुझे डुप्लिकेट को छोड़कर सभी कॉलम सूचीबद्ध करना है तो यह दर्द हो सकता है। क्या कोई SQL क्वालीफायर है जो मुझे निर्दिष्ट किए गए सभी कॉलम को सूचीबद्ध करने देगा? –

+0

मुझे नहीं पता कि। – tgandrews

4

के बाद से ऐसा लगता है कि टेबल आप पर शामिल हो रहे हैं के सबसे पहले एक को छोड़कर कुछ कॉलम है, कैसे के बारे में:

SELECT Recipes.*, 
      Recipe_Prep_Texts.Preparation_Text, 
      Recipe_Pictures.Foo, -- describe is missing in OP 
      mp_References.ID_Title, 
      mp_References.ID_Category 

    FROM Recipes 
LEFT JOIN (Recipe_Prep_Texts, Recipe_Pictures, mp_References) 
     ON (
      Recipe_Prep_Texts.ID_Prep_Text = Recipes.ID_Prep_Text AND 
      Recipe_Pictures.ID_Picture = Recipes.ID_Picture AND 
      mp_References.ID_Reference = Recipes.ID_Reference 
     ); 

मैं आपको बता नहीं सकता कि कितनी बार मैं कामना मैं

था
SELECT (* - foo) FROM table 

विशेष रूप से ऐसे मामलों में जहां फू बीएलओबी की तरह कुछ बड़ा क्षेत्र है और मैं सिर्फ प्रारूपण को तोड़ने के बिना बाकी सब कुछ देखना चाहता हूं।

+2

हालांकि प्रत्येक वैध कॉलम को समझा जाना संभव है, मुझे लगता है कि यह मेरे प्रोग्राम के लिए बहुत काम है और डेटाबेस में भेजे गए SQL कथन की लंबाई में भी जोड़ता है। नीचे डैनी का जवाब देखें। –

0

निम्न क्वेरी का प्रयास करें:

SELECT name,ac,relation_name 
FROM table1 
LEFT JOIN table2 USING (ID_Prep_Text) 
LEFT JOIN table3 USING (ID_Picture); 

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

  • कोई संबंधित समस्या नहीं^_^