mysql,

2012-06-07 6 views
21

मैं उपयोगकर्ता जानकारी की विरासत तालिका है मूल्य के रूप में एक और स्तंभ स्तंभ नाम के रूप में गतिशील पंक्ति मानों का चयन करें (जो सक्रिय उपयोग में अब भी है) और मैं की संरचना को बदल नहीं सकते हैं -mysql,

id name  value 
------------------------------ 
0  timezone Europe/London 
0  language en 
0  country 45 
0  something x 
1  timezone Europe/Paris 
1  language fr 
1  country 46 

समय क्षेत्र/भाषा/देश आदि नामों में से केवल उदाहरण हैं, वे चर हो सकता है/वहाँ उस स्तंभ की पंक्तियों पर अद्वितीय के अलावा अन्य कोई निश्चित सूची है

मैं एक MySQL संगत SQL क्वेरी कि वापसी होगी की जरूरत है -

id timezone  language country something 
--------------------------------------------------- 
0  Europe/London en   45  x 
1  Europe/Paris fr   46 

मैंने MySQL में पिवट तालिका कार्यक्षमता हैकिंग के आसपास स्टैक ओवरफ्लो पर विभिन्न उत्तरों को देखा है, और इसी तरह, लेकिन उनमें से कोई भी एक ही तालिका के कॉलम से अद्वितीय पंक्ति मानों से परिवर्तनीय कॉलम नाम उपनाम का उपयोग करने के इस मामले से मेल नहीं खाता है। यद्यपि मेरे पास बहुत नींद आ गई है, इसलिए वे सभी एक धुंधला हो जाना शुरू कर रहे हैं, अग्रिम में क्षमा चाहते हैं।

निकटतम मैं मिल सकता है जो पहला नाम स्तंभ से सभी संभव/अनन्य मानों मिलेगा तैयार बयान https://stackoverflow.com/a/986088/830171 का उपयोग करें और एक प्रश्न CASE WHEN का उपयोग करता है के निर्माण के लिए, हो सकता है और/या एकाधिक उप SELECT या JOIN एक ही मेज प्रश्नों पर।

विकल्प जो मैं सोच सकता हूं वह उस उपयोगकर्ता आईडी के लिए सभी पंक्तियां प्राप्त करना होगा और उन्हें एप्लिकेशन में स्वयं को फॉर-लूप में संसाधित करना होगा, या नामों को सीमित राशि तक सीमित करने का प्रयास करें और उप -SELECT एस/JOIN एस। हालांकि यदि दूसरा नाम जोड़ा गया है तो दूसरा विकल्प आदर्श नहीं है, मुझे इस क्वेरी पर फिर से जाना होगा।

कृपया मुझे बताओ कि मैं कुछ स्पष्ट

+0

क्या आपको वास्तव में इसे 'एसक्यूएल' में व्यक्त करने की आवश्यकता है या आपकी प्रोग्रामिंग भाषा पसंद के साथ पर्याप्त प्रसंस्करण होगी? यदि आपको अपने डी-फ़नलग्लड डेटा के विरुद्ध शामिल होने की आवश्यकता है, तो एक दृश्य/proc चाल हो सकती है। – bluevector

+0

ये मैं अब के लिए एप्लिकेशन स्तर में गड़बड़ रखूंगा - मुझे उस उपयोगकर्ता आईडी और लूप को एक सहयोगी सरणी में डेटा डालने पर मिल जाएगा। मैं सिर्फ यह देखना चाहता था कि यह एकमात्र अच्छा विकल्प था। माइग्रेशन और एक-ऑफ रिपोर्ट के लिए SQL विधि रखने के लिए अभी भी बहुत आसान है। – gingerCodeNinja

उत्तर

39

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

आप पूरी तरह MySQL के भीतर ऐसे जोड़तोड़ perfom करना आवश्यक है, एक तैयार बयान के निर्माण — जाना हालांकि बल्कि CASE साथ चारों ओर खिलवाड़ से रास्ता है, मैं शायद सिर्फ MySQL के GROUP_CONCAT() समारोह का उपयोग करेंगे:

SELECT CONCAT(
    'SELECT `table`.id', GROUP_CONCAT(' 
    , `t_', REPLACE(name, '`', '``'), '`.value 
     AS `', REPLACE(name, '`', '``'), '`' 
    SEPARATOR ''), 
' FROM `table` ', GROUP_CONCAT(' 
    LEFT JOIN `table` AS `t_', REPLACE(name, '`', '``'), '` 
      ON `table`.id = `t_', REPLACE(name, '`', '``'), '`.id 
      AND `t_', REPLACE(name, '`', '``'), '`.name = ', QUOTE(name) 
    SEPARATOR ''), 
' GROUP BY `table`.id' 
) INTO @qry FROM (SELECT DISTINCT name FROM `table`) t; 

PREPARE stmt FROM @qry; 
EXECUTE stmt; 

देखें यह sqlfiddle पर है।

ध्यान दें कि GROUP_CONCAT() का परिणाम group_concat_max_len वैरिएबल (1024 बाइट्स का डिफ़ॉल्ट) तक सीमित है: यहां तक ​​कि प्रासंगिक होने की संभावना नहीं है जब तक कि आपके पास कुछ बेहद लंबा name मान न हो)।

+4

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

+0

मेरे पास एक बहुत ही समान परिदृश्य है और मुझे आपके उत्कृष्ट उदाहरण का उपयोग करके, पिवोटेड परिणाम ठीक दिखाई देता है।लेकिन मुझे एक टेबल में संग्रहित होने के परिणाम की आवश्यकता है क्योंकि मैं इससे एक चार्ट उत्पन्न करना चाहता हूं। क्या पिवोटेड परिणाम को एक टेबल में स्टोर करना संभव है? साथ ही, क्या पीएचपी में उपरोक्त निष्पादित करना संभव है? मेरी स्रोत तालिका उपयोगकर्ता, दिनांक, प्रदर्शन और पिवट उपयोगकर्ता के रूप में पंक्तियों, कॉलम के रूप में दिनांक और सेल मानों के रूप में प्रदर्शन है। – Sri

+0

मेरे उदाहरण तालिका को एसक्लफ्लिड पर डालें (कृपया http://sqlfiddle.com/#!2/06be4/1) – Sri