2011-11-17 16 views
8

पर आधारित टेबल में शामिल हों, मुझे आश्चर्य है कि यह भी सकारात्मक है या नहीं।MYSQL कॉलम डेटा और तालिका नाम

मैं तालिका 1 के डेटा के आधार पर 2 टेबल में शामिल होना चाहता हूं। उदाहरण तालिका 1 में डेटा डेटा "हॉटडॉग" के साथ कॉलम भोजन है।

और मेरे पास हॉटडॉग नामक एक टेबल है।

क्या यह एक जॉइन करना संभव है।

SELECT * FROM table1 t join t.food on id = foodid 

मुझे पता है कि यह काम नहीं करता है, लेकिन यह भी सकारात्मक है, क्या कोई काम आसपास है?

अग्रिम धन्यवाद।

+1

यह एक डिज़ाइन समस्या की तरह लगता है - यदि आप रनटाइम तक अपने जुड़ने को नहीं जानते हैं तो आप कभी भी संदर्भित अखंडता को कैसे लागू करेंगे? – tomfumb

उत्तर

9

नहीं, आप table1 में प्रति पंक्ति एक अलग मेज पर शामिल नहीं हो सकते, यहां तक ​​कि नहीं गतिशील एसक्यूएल साथ @Cade रॉक्स पता चलता है के रूप में।

आप पंक्तियों के लिए hotdog तालिका में शामिल हो सकते हैं जहां भोजन 'हॉटडॉग' है और भोजन के अन्य विशिष्ट मूल्यों के लिए अन्य तालिकाओं में शामिल हो सकता है।

SELECT * FROM table1 JOIN hotdog ON id = foodid WHERE food = 'hotdog' 
UNION 
SELECT * FROM table1 JOIN apples ON id = foodid WHERE food = 'apples' 
UNION 
SELECT * FROM table1 JOIN soups ON id = foodid WHERE food = 'soup' 
UNION 
... 

यह जरूरी है कि आप भोजन के सभी अलग-अलग मान पता है, और सभी संबंधित खाद्य टेबल संगत कॉलम ताकि आप यूनिअन कर सकते हैं उन्हें एक साथ है।

आप जो कर रहे हैं उसे पॉलिमॉर्फिक एसोसिएशन कहा जाता है। यही है, table1 में विदेशी कुंजी table1 के दूसरे कॉलम में मान के आधार पर एकाधिक "पैरेंट" टेबल में पंक्तियों को संदर्भित करती है। यह संबंधपरक डेटाबेस प्रोग्रामर की एक आम डिजाइन गलती है।

वैकल्पिक समाधान के लिए, करने के लिए अपने जवाब देखें:

मैं भी अपनी प्रस्तुति Practical Object Oriented Models In SQL में बहुरूपी संघों के लिए समाधान को कवर किया, और मेरी किताब SQL Antipatterns: Avoiding the Pitfalls of Database Programming में।

0

केवल गतिशील एसक्यूएल के साथ। कई अलग-अलग तालिकाओं में शामिल होना और प्रकार के आधार पर केस का उपयोग करना भी संभव है, लेकिन तालिकाओं को सभी को पहले से ही जाना होगा।

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

Say you have a table of foods: 

id INT 
foodtype VARCHAR(50) (right now it just contains 'hotdog' or 'hamburger') 
name VARCHAR(50) 

Then hotdogs: 

id INT 
length INT 
width INT 

Then hamburgers: 

id INT 
radius INT 
thickness INT 

आम तौर पर मैं अस्तित्व के लिए केवल एक सहायक तालिका को बाधित करने के लिए कुछ प्रणाली की सिफारिश करेंगे, लेकिन सादगी के लिए, मुझे लगता है कि बाहर जा रहा हूँ।

SELECT f.*, hd.length, hd.width, hb.radius, hb.thickness 
FROM foods f 
LEFT JOIN hotdogs hd 
    ON hd.id = f.id 
    AND f.foodtype = 'hotdog' 
LEFT JOIN hamburgers hb 
    ON hb.id = f.id 
    AND f.foodtype = 'hamburger' 

अब आप कि ऐसी बात कोड उत्पन्न किया जा सकता देखेंगे (या यहां तक ​​कि मक्खी पर एक बहुत ही धीमी गति से प्रोटोटाइप गतिशील एसक्यूएल के लिए) तालिका नाम और तालिका मेटाडाटा के लिए उपयोग के बारे में SELECT DISTINCT foodtype FROM foods दिया कुछ मान्यताओं से।

समस्या यह है कि आखिरकार जो भी इस क्वेरी के परिणाम का उपभोग करता है उसे नए कॉलम जोड़े जाने पर नए कॉलम के बारे में पता होना चाहिए।

तो प्रश्न डेटा के आपके ग्राहक/उपभोक्ता को वापस ले जाता है - यह विभिन्न प्रकारों को कैसे संभालने जा रहा है? और एक ही सेट में विभिन्न प्रकार के होने का क्या अर्थ है? और यदि इसे विभिन्न प्रकारों से अवगत होना चाहिए, तो प्रत्येक प्रकार के लिए अलग-अलग प्रश्न लिखने या मैन्युअल क्वेरी को बदलने की क्या कमी है जब नए प्रकार जोड़े जाते हैं, वैसे भी इस तरह के बदलाव के सापेक्ष प्रभाव को देखते हैं?

+0

रीप्ले के लिए Thnks .... मुझे यूनियन समाधान पसंद आया है, मुझे यकीन है कि इसे लागू करने के लिए गर्म नहीं है। तो विस्तार से पता चलता है। छात्र "अनुरोध" तालिका पर, छात्र के डेटा और "अक्षर प्रकार" पर सहेजे गए पत्र के कुछ टेप पर अनुरोध करता है। "अक्षर प्रकार" के लिए 10 अलग-अलग सकारात्मक मान हैं। इसलिए मेरे पास विशिष्ट अक्षर प्रकार के नाम के साथ 10 टेबल हैं, जैसे .. तालिका अनुशंसा, तालिका स्थानांतरण, तो मैं 1 क्वेरी पर सभी चयन करने का एक तरीका चाहता था छात्र पत्र के आधार पर, विशिष्ट तालिका को कॉल करने के लिए और इससे डेटा प्राप्त करें। – user1052347

+0

@ user1052347 बिल करविन डिज़ाइन के कई लिंक देता है। आखिरकार, क्योंकि प्रत्येक प्रकार के लिए संबंधित डेटा अलग है, वास्तविक "चयन *" काम करने की संभावना नहीं है, क्योंकि प्रत्येक तालिका में सहायक जानकारी अलग-अलग होने जा रही है। आपको यह तय करने की ज़रूरत है कि आप परिणाम सेट को किस तरह दिखाना चाहते हैं। उस बिंदु पर, आप हाथ से कोड (या संभावित रूप से कोड उत्पन्न/गतिशील एसक्यूएल भी कर सकते हैं - इस प्रकार कुछ हद तक बदलते स्कीमा के साथ रखरखाव की समस्याओं को खत्म कर सकते हैं)। मैं अपने जवाब में एक उदाहरण दूंगा। –

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