2013-07-30 11 views
5

मैं MySQL में नया हूं। मुझे यकीन नहीं है कि मैं सही बात कर रहा हूं। मदद चाहिए।गतिशील रूप से तालिका में शामिल हों MySQL

id, source_type, source_id, survey_date_time:

मैं एक मेज survey जो निम्नलिखित स्तंभ होता है।

अन्य दो तालिकाओं हैं:

education जो id, col1, col2, col3 स्तंभों की है।

games जिसमें id, col4, col5, col6 कॉलम हैं।

डाटा survey तालिका में:

id  source_type source_id survey_date_time 
-------------------------------------------------------- 
100  education   1   2013-07-25 00:00:00 
101  games    1   2013-07-25 00:00:00 
102  games    2   2013-07-26 00:00:00 
103  education   2   2013-07-26 00:00:00 

education में डेटा तालिका

id col1   col2   col3  
-------------------------------------------- 
1  col1_data1 col2_data1 col3_data1 
2  col1_data2 col2_data2 col3_data2 

games

id col4   col5   col6  
-------------------------------------------- 
1  col4_data1 col5_data1 col6_data1 
2  col4_data2 col5_data2 col6_data2 

में डेटा तालिका मैं डेटा डीवाई पढ़ना चाहते हैं namically चाहते:

select * from survey left join {survey.sorce_type} on {survey.sorce_type}.id=survey.source_id where survey.id={given_id}

आप स्कीमा here

अग्रिम धन्यवाद पा सकते हैं।

अद्यतन: चयन बयान survey.*, {survey.sorce_type}.* बजाय *

धन्यवाद

+0

तकनीकी रूप से, आपको डायनामिक एसक्यूएल का उपयोग करने की आवश्यकता है, जिसका अर्थ है MySQL के तैयार स्टेटमेंट सिंटैक्स – Jivan

उत्तर

6

यह पूरा करना चाहिए होगा क्या आप देख रहे हैं:

SELECT * 
    FROM survey s 
    LEFT JOIN eduction e ON s.source_type = 'education' AND e.id = s.source_id 
    LEFT JOIN games g ON s.source_type = 'games' AND g.id = s.source_id 

एसक्यूएल फिडल here है।

अनिवार्य रूप से, यह source_type के आधार पर उचित तालिका में शामिल हो जाता है। तो जब यह education है तो यह eduction तालिका में शामिल हो जाता है (आपको वहां एक वर्तनी गलती हो सकती है) और जब यह games है तो यह games तालिका में शामिल हो जाता है।

+1

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

+0

आपको तालिका संरचना को फिर से डिजाइन करना होगा ... उदा। survey_data: survey_type_id, col1, col2, col3, col4, col5, col6। survey_type: id, type_name। सर्वेक्षण: आईडी, सर्वे_type_id, survey_data_id, date_created। – AEQ

+0

@AEQ क्या आप उस दृष्टिकोण को समझा सकते हैं जो आप कुछ और सुझाव दे रहे हैं? – antoniovassell

1

इसके लिए आपको तैयार बयान के साथ एक प्रक्रिया बनाने की आवश्यकता है।

DELIMITER | 
CREATE PROCEDURE `JoinWithSurvey`(param_leftTable VARCHAR(50), param_id VARCHAR(10)) 
BEGIN 
SET @QUERY1 = concat('select survey.*,',param_leftTable,'.* from survey left join ',param_leftTable,' on ',param_leftTable,'.id=survey.source_id where survey.id = ', param_id ,';'); 
PREPARE stmt FROM @QUERY1; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
END | 

तब कि एसपी

call JoinWithSurvey('eduction','100'); 

ID SOURCE_TYPE SOURCE_ID SURVEY_DATE_TIME COL1 COL2 COL3 
100 education 1 July, 25 2013 00:00:00+0000 col1_data1 col2_data1 col3_data1 

call JoinWithSurvey('games','102'); 

ID SOURCE_TYPE SOURCE_ID SURVEY_DATE_TIME COL4 COL5 COL6 
102 games 2 July, 26 2013 00:00:00+0000 col4_data2 col5_data2 col6_data2 
102 education 2 July, 26 2013 00:00:00+0000 col4_data2 col5_data2 col6_data2 

मैं यहाँ एक varchar के रूप में पारित कर दिया आईडी फोन .. आप के रूप में पूर्णांक के रूप में अच्छी तरह से टाइप उपयोग कर सकते हैं ..:)

एक

Working fiddle here

+0

धन्यवाद। लेकिन क्या कोई समाधान है जहां मुझे टेबल नाम (जो 'source_type' है) पास नहीं करना है? मैं बस 'सर्वेक्षण' तालिका 'आईडी' पास करना चाहता हूं। तालिका 'source_type' से 'सर्वेक्षण' के साथ गतिशील रूप से शामिल हो जाएगी। –

+1

सिस्टम कैसे पता चलेगा कि आपको इन सभी तालिकाओं में शामिल होने की आवश्यकता है जबतक कि आप सिस्टम में शामिल होने के लिए नहीं कहें। ?। मार्टिन पार्किन द्वारा एक वैकल्पिक समाधान पहले से ही इंगित किया गया है, जहां आपको जाने और शामिल होने के लिए सभी तालिकाओं को बताने की आवश्यकता है। आशा है कि आपको मेरा अंक मिल जाएगा। –

+0

'source_type' कॉलम तालिका का नाम है। अगर मेरे पास आईडी थी तो मैं तालिका को 'source_type' कॉलम फॉर्म ढूंढ सकता हूं। –

0

आप तालिका संरचना जो तब आप अधिक सर्वेक्षण प्रकार जोड़ने के लिए, यदि कॉलम ही कर रहे हैं, तो आप पुनः उपयोग कर सकते की अनुमति होगी नया स्वरूप सकता है की कोशिश है कॉलम लेकिन यदि नहीं, रिक्त डाटा बहुत ही कम जगह का उपयोग करता है (संदर्भ: NULL in MySQL (Performance & Storage))

एसक्यूएल बेला: http://sqlfiddle.com/#!2/76889/3

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