Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

डुप्लिकेट को अनदेखा करते हुए दो कॉलम, एकाधिक पंक्तियों को मर्ज करें - MySQL

आप इसे इस कथन के साथ कर सकते हैं (नहीं, यह अच्छा नहीं लग रहा है), यह मानते हुए कि आपकी तालिका का नाम example है :

UPDATE
    example e1
SET
    e1.type_a = (
        SELECT
            CONCAT('*', GROUP_CONCAT(DISTINCT n1.value ORDER BY n1.value SEPARATOR '*'), '*') as type_a
        FROM ( 
            SELECT
                id, 
            CASE 
                WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(BOTH '*' FROM e.type_a), '*', n.n), '*', -1) = '' THEN NULL
                ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(BOTH '*' FROM e.type_a), '*', n.n), '*', -1)
            END value
            FROM example e CROSS JOIN (
                SELECT 
                    a.N + b.N * 10 + 1 AS n
                FROM
                    (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
                   ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
                ORDER BY n
            ) n
            WHERE 
                n.n <= 1 + (LENGTH(e.type_a) - LENGTH(REPLACE(e.type_a, '*', '')))
            UNION
            SELECT
                id, 
            CASE 
                WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(BOTH '*' FROM e.type_b), '*', n.n), '*', -1) = '' THEN NULL
                ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(BOTH '*' FROM e.type_b), '*', n.n), '*', -1)
            END value
            FROM example e CROSS JOIN (
                SELECT 
                    a.N + b.N * 10 + 1 AS n
                FROM
                    (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
                   ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
                ORDER BY n
            ) n
            WHERE 
                n.n <= 1 + (LENGTH(e.type_b) - LENGTH(REPLACE(e.type_b, '*', '')))
        ) n1
        WHERE 
            n1.id = e1.id
        GROUP BY 
            id
    ),
    e1.type_b = ''
;

डेमो सेलेक्ट स्टेटमेंट का

स्पष्टीकरण

मूल रूप से मैंने विधि को अपनाया। का peterm बंटवारा करने के लिए। मुझे बाहरी * remove को हटाना पड़ा पहले TRIM द्वारा।

खाली स्ट्रिंग को कॉलम मान के रूप में अनुमति देने के लिए, मैंने ऐसे मानों को खत्म करने के लिए CASE निर्माण जोड़ा है। यदि आपके कॉलम में इसके बजाय NULL मान हैं, तो आप CASE को

. द्वारा प्रतिस्थापित कर सकते हैं
SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(BOTH '*' FROM e.type_a), '*', n.n), '*', -1)

और

SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(BOTH '*' FROM e.type_a), '*', n.n), '*', -1)

इस निर्माण का UNION (बिना ALL कीवर्ड) हमें अलग-अलग रंग मानों की सूची देगा और GROUP BY id और GROUP_CONCAT के साथ हमें * अलग मूल्य सूची मिलेगी। अंत में हम एक अग्रणी और अनुगामी * . जोड़ते हैं अपनी आवश्यकताओं से मेल खाने के लिए।

अपडेट के लिए आपको चयन को संशोधित करना होगा, ताकि यह एक पंक्ति के साथ सिर्फ एक कॉलम लौटाए (कहां क्लॉज के साथ)।

नोट

जैसा कि पीटरम ने कहा है, यह आपकी मूल्य सूची में 100 मानों तक की अनुमति देगा। मुझे विश्वास नहीं है कि आपको और अधिक की आवश्यकता होगी, लेकिन यदि आप करेंगे, तो आपको अपनी आवश्यकताओं के अनुसार संख्याओं के सृजन को अनुकूलित करना होगा।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL index_length बाइट्स में है?

  2. डेटाबेस रूटर्स के साथ Django ऐप्स के बीच (mysql) डेटाबेस साझा करना

  3. MySQL एक Enum में फ़ील्ड जोड़ें

  4. Mysql INSTR mongodb में ऑपरेशन की तरह

  5. MySQL दृश्य कैसे बनाएं और उपयोग करें