2016-09-05 6 views
10

अलग स्ट्रिंग सूची का निर्माण और mysql में नए मूल्यों के साथ एक ही सूची की जगह मैं अपने table_1 टेबल table_1 (वर्तमान में बचाया संरचना)एक स्ट्रिंग अलग और यह

code  value 
12_A  ["A","B","C","D"] 
12_B  ["E","F","G","H"] 
12_3  ["I","J","K","L"] 

लेकिन हर कोड में निम्न डेटा है फिर कैसे अलग-अलग विवरण के साथ अलग-अलग मान हैं। की तरह ::

code value  description 
12_A A   Apple 
12_A B   Ball 
12_A C   Cat 
12_A D   Dog 
12_B E   Eagle 
12_B F   Flag 
.  .   . 
.  .   . 
.  .   . 

मैं table_1 से मूल्य सूची अलग करने के लिए और (इस संरचना में) एक ही मेज यानी table_1 में फिर से बचाने के लिए की जरूरत है ::

code   value 
12_A   ["Apple","Ball","Cat","Dog"] 
12_B   ["Eagle","Flag",.......] 
12_3   [......................] 
+0

इस प्रारूप में स्ट्रिंग मान बुरा डाटाबेस डिजाइन – Jens

उत्तर

4

आप GROUP_CONCAT() उपयोग कर सकते हैं:

UPDATE Table1 s 
SET s.value = (SELECT t.code,CONCAT('["', 
          GROUP_CONCAT(t.description ORDER BY t.description SEPARATOR '","'), 
          ']') 
      FROM Table_With_val t 
      WHERE t.code = s.code 
       AND s.value LIKE CONCAT('%"',t.value,'"%')) 

आपने कोई निर्णायक जानकारी प्रदान नहीं की है, मुझे लगता है कि आपके द्वारा प्रदान किया गया दूसरा डेटा नमूना एक मौजूदा तालिका है, और तालिका 1 वह तालिका है जिसे आप चाहते हैं अद्यतन करें।

नोट: यह खराब डीबी संरचना है! यह सबसे अधिक बदनाम रूप से भविष्य में समस्या का कारण बनता है, खासकर जब जुड़ने की आवश्यकता होती है। मैं दृढ़ता से आपको अपने डेटा को सामान्य करने और अपने विवरण में प्रत्येक विवरण और मूल्य को स्टोर करने की सलाह देता हूं।

+0

, [ 'बी' 'ए',] table_1 में, और हम है इस तर्क के माध्यम से जा जबकि मैं एक समस्या है, का सामना करते हैं मैं केवल कोड मूल्य 12_A है है तालिका 2, में कोड 12_A के लिए सभी मानों अर्थात ए, बी, सी, डी, ई के लिए विवरण है, तो सभी ["ऐप्पल", "बॉल", "बिल्ली", "कुत्ता] तालिका_1 में अपडेट किया गया है। लेकिन हमारा आवश्यक आउटपुट है केवल ["ऐप्पल", "बॉल"] –

+0

तो table_1 और table_2 मेल नहीं खाता है? उस प्रश्न में आपको कुछ उल्लेख किया जाना चाहिए .. – sagi

+0

हां, तालिका_2 में मानों को ठीक किया गया है लेकिन table_1 में, सभी या कम मूल्य हो सकते हैं जिसमें तालिका_2 में वर्णन है। –

4

आप एक ऐसा फ़ंक्शन बना सकते हैं जिसमें आप अपनी स्ट्रिंग सूची को पैरामीटर के रूप में पास कर सकते हैं, उदाहरण के मामले में ["ए", "बी", "सी", "डी"] पैरामीटर होगा। फ़ंक्शन स्ट्रिंग को तोड़ देगा और विवरणों को समेकित करेगा। आपके द्वारा उपयोग किए जा सकने वाले फ़ंक्शन का उदाहरण नीचे दिया गया है:

DELIMITER $$ 

DROP FUNCTION IF EXISTS codeToDesc$$ 

CREATE FUNCTION codeToDesc(commaSeperatedCodeList TEXT) RETURNS TEXT CHARSET utf8 
BEGIN 
DECLARE finalString TEXT; 
DECLARE inputCodeList TEXT; 
DECLARE codeName VARCHAR(255); 
DECLARE codecount BIGINT(5); 

SET finalString=''; 
SET inputCodeList = REPLACE(REPLACE(REPLACE(commaSeperatedCodeList,'[',''),']',''),'"',''); 

DROP TEMPORARY TABLE IF EXISTS test.code_table; 
DROP TEMPORARY TABLE IF EXISTS test.code_count; 
CREATE TEMPORARY TABLE test.code_table (CODE VARCHAR(255)); 
CREATE TEMPORARY TABLE test.code_count (countNo BIGINT(11)); 

INSERT INTO test.code_count(countNo) SELECT(LENGTH(inputCodeList)-LENGTH(REPLACE(inputCodeList,',','')) + 1); 

BEGIN 

    DECLARE table_cursor CURSOR FOR SELECT countNo FROM test.code_count; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET codecount = (SELECT countNo FROM test.code_count ORDER BY countNo ASC LIMIT 1); 

    OPEN table_cursor; 
    readLoop1: LOOP 

    FETCH table_cursor INTO codecount; 

     IF codecount=0 THEN 
       LEAVE readLoop1; 
     END IF; 

    SET codeName=(SELECT SUBSTRING_INDEX(inputCodeList,',',1)); 
    INSERT INTO test.code_table(CODE) SELECT codeName; 
    SET inputCodeList=(SELECT TRIM(BOTH ',' FROM REPLACE(inputCodeList,codeName,''))); 
    INSERT INTO test.code_count(countNo) SELECT codecount-1;  
    SET codeName=''; 

    END LOOP; 
    CLOSE table_cursor; 
END;  

    -- use your code and description here, i guess those should be fixed 
    SELECT CONCAT('["',REPLACE(GROUP_CONCAT(CASE WHEN CODE='A' THEN 'Apple' 
       WHEN CODE = 'B' THEN 'Ball' 
       WHEN CODE = 'C' THEN 'Cat' 
       WHEN CODE = 'D' THEN 'Dog' 
       ELSE '' END),',','","'),'"]') INTO finalString FROM test.code_table; 

    RETURN finalString; 

END$$ 

DELIMITER ; 

इसे आज़माएं, अगर आपको कोई समस्या हुई तो मुझे बताएं।

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