2012-01-08 13 views
19

यह एक पोस्टग्रेज़ डीबी है। मैं एक पशु तालिका में स्थित विदेशी कुंजियों के आधार पर प्रदर्शित करने के लिए, एक नस्ल तालिका से कुत्ते नस्ल के नाम (कैने कोरो, लैब्राडोर, आदि) खींचने का प्रयास कर रहा हूं। मेरी समस्या यह है कि पशु तालिका में इस एकल नस्ल तालिका में दो विदेशी कुंजी हैं, और मुझे अपनी क्वेरी के साथ त्रुटियां मिल रही हैं। पहली नस्ल का नाम बाएं जुड़ने के आधार पर वापस आ जाएगा, लेकिन दूसरा मुझे नाम प्रदर्शित नहीं कर सकता क्योंकि मेरे पास पहले से ही बाएं शामिल हैं।पोस्टग्रेज़ एकाधिक में शामिल होते हैं

breed table (ID, BreedName) 
animal table (ID, breedID, breed2ID) 

SELECT animal.ID, breed.BreedName FROM animal LEFT JOIN breed ON animal.breedID=breed.ID WHERE animal.ID='7'; 

मैं क्या करने की जरूरत है भी है animal.breed2ID जो मैं पर बुरी तरह नाकाम रहने के लिए कर रहा हूँ में शामिल होने के BreedName मिलती है: नीचे क्या मैं क्या करने की कोशिश कर रहा हूँ की एक सरल रूपरेखा है। मैं नस्ल के नामों को आसानी से कड़ी मेहनत कर सकता हूं और इसे एप्लिकेशन में प्रदर्शित कर सकता हूं, लेकिन यह डेटाबेस में नस्लों के नामों के परिवर्तन, जोड़ों या हटाने के लिए अनुकूल नहीं है।

उत्तर

38

सिर्फ एक और करना है कि एक ही मेज पर शामिल होने:

SELECT animal.ID, breed1.BreedName as BreedName1, breed2.BreadName as BreadName2 
FROM animal 
    LEFT JOIN breed as breed1 ON animal.breedID=breed1.ID 
    LEFT JOIN breed as breed2 ON animal.breedID=breed2.ID 
WHERE animal.ID='7'; 
+0

बहुत बहुत धन्यवाद। योजना के अनुसार बिल्कुल स्पष्ट और काम किया! मैं सिर्फ एक नस्ल कर इसे गड़बड़ कर रहा था। एनीमलनाम एएस नस्ल नाम 1, नस्ल। एनीमलनाम AS breedName2। मेज के अलियासिंग पूरी तरह से याद किया! धन्यवाद, तकनीक साइटों पर मैंने देखा है कि यह सबसे अच्छी मदद है! – user1137376

+0

अरे कोई समस्या नहीं, इसलिए हम यहां क्यों हैं: डी मैं स्टारशिप 3000 के पोस्ट से भी सहमत हूं। लेकिन मुझे लगता है कि 3 या अधिक नस्लों वाले कुत्ते नहीं होंगे। लेकिन अगर वे करते हैं, तो स्टार द्वारा अनुशंसित अनुग्रह लेना सुनिश्चित करें। – kingdaemon

14

इवान अपने वर्तमान डेटाबेस के लिए आपकी समस्या हल हो गया है एक लंबी अवधि के विचार या सिर्फ एक बात के लिए डिजाइन से जानने के लिए होगा अपने टेबल डिजाइन और अधिक बनाने के लिए सामान्यीकृत ताकि जब भी आप किसी जानवर को नस्ल जोड़ना चाहते हैं तो एक नया जुड़ना जरूरी नहीं है। इस सरल डिजाइन के माध्यम से आपने वास्तव में अपने जीवन को और अधिक कठिन बना दिया है।

जब आप किसी इकाई पर बार-बार संपत्ति प्रकार देखते हैं, तो आपके मामले में breedID और breed2ID में आपको आम तौर पर कुछ दुर्लभ मामलों में सड़ा हुआ गंध शुरू करना चाहिए।

आदर्श डिजाइन के तहत आप निम्न कार्य करेंगे।

1. अपनी नस्ल को इस तरह रखें।

2. जानवर को जानवर (पशु_आईडी, पशु_नाम) जैसे कुछ दिखें।

3. एक नई animal_breed तालिका जोड़ें। यह इस पशु_ब्रीड (animal_breed_id, animal_id, breed_id) जैसा दिखेगा। Animal_bread_id एक पीके होने के साथ और संबंधित टेबल पर वापस जाने वाली विदेशी कुंजी के साथ (animal_id, breed_id) पर एक अनूठी कुंजी है।

यह डिज़ाइन एक दिए गए जानवर को कई नस्लों को वापस करने के लिए आपकी क्वेरी के साथ गड़बड़ करने के साथ एक या अधिक नस्लों के प्रकारों को लेने की अनुमति देता है। जब भी आपके पास एक अतिरिक्त नस्ल वाला जानवर होता है तो आपका वर्तमान डिज़ाइन एक दुःस्वप्न बन जाता है। इसमें प्रदर्शन को मारने और रखरखाव को एक दुःस्वप्न बनाने की क्षमता है और इसके शीर्ष पर बस ध्वनि डेटाबेस डिज़ाइन नहीं है।

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