Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Gabungkan dua kolom, beberapa baris mengabaikan duplikat - MySQL

Anda bisa melakukannya dengan pernyataan ini (tidak, itu tidak terlihat bagus), dengan asumsi nama tabel Anda adalah 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 = ''
;

Demo dari pernyataan SELECT

Penjelasan

Pada dasarnya saya mengadaptasi metode dari peterm untuk menyelesaikan pemisahan. Saya harus menghapus * . bagian luar pertama oleh TRIM.

Untuk mengizinkan string kosong sebagai nilai kolom, saya telah menambahkan konstruksi CASE, untuk menghilangkan nilai tersebut. Jika kolom Anda memiliki nilai NULL, Anda dapat mengganti CASE dengan

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

dan

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

UNION (tanpa kata kunci ALL) dari konstruksi ini akan memberi kita daftar nilai warna yang berbeda dan dengan GROUP BY id dan GROUP_CONCAT kita akan mendapatkan * daftar nilai yang dipisahkan. Terakhir kita tambahkan * di awal dan di akhir agar sesuai dengan kebutuhan Anda.

Untuk pembaruan, Anda harus memodifikasi pilihan, sehingga hanya mengembalikan satu kolom dengan satu baris (dengan klausa where).

Catatan

Seperti yang dinyatakan oleh peterm ini akan memungkinkan hingga 100 nilai dalam daftar nilai Anda. Saya tidak yakin Anda akan membutuhkan lebih banyak, tetapi jika Anda mau, maka Anda harus menyesuaikan pembuatan angka dengan kebutuhan Anda.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lancar NHibernate DuplicateMappingException dengan AutoMapping

  2. MySQL mengurutkan berdasarkan beberapa daftar

  3. koneksi excel vba mysql ado

  4. Bagaimana cara menghapus item dari tabel secara rekursif?

  5. Mengapa INSERT IGNORE menambah kunci utama auto_increment?