Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Połącz dwie kolumny, wiele wierszy ignorując duplikaty - MySQL

Możesz to zrobić za pomocą tej instrukcji (nie, nie wygląda to ładnie), zakładając, że nazwa twojej tabeli to 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 instrukcji SELECT

Wyjaśnienie

Zasadniczo zaadaptowałem metodę z peterm aby dokonać podziału. Musiałem usunąć zewnętrzny * najpierw TRIM.

Aby umożliwić pusty ciąg jako wartość kolumny, dodałem konstrukcję CASE, aby wyeliminować takie wartości. Jeśli zamiast tego Twoja kolumna ma wartości NULL, możesz zastąpić CASE przez

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

i

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

UNION (bez słowa kluczowego ALL) tej konstrukcji da nam listę odrębnych wartości kolorów, a z identyfikatorem GROUP BY i GROUP_CONCAT otrzymamy listę wartości oddzielonych *. Na koniec dodajemy początkowy i końcowy * aby spełnić Twoje wymagania.

W przypadku aktualizacji musisz zmodyfikować zaznaczenie, aby zwracało tylko jedną kolumnę z jednym wierszem (z klauzulą ​​where).

Uwaga

Jak stwierdził peterm, pozwoli to na dodanie do 100 wartości na liście wartości. Nie sądzę, że będziesz potrzebował więcej, ale jeśli chcesz, musisz dostosować generowanie liczb do swoich potrzeb.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak obliczyć średnią kroczącą w MySQL

  2. MYSQL i Phpmyadmin nie wyświetlają tej samej bazy danych

  3. Co może prowadzić do problemu z nieznanym obiektem w pliku kopii zapasowej podczas przywracania kopii zapasowej bazy danych MySQL?

  4. pivot w zapytaniach mysql

  5. Dodawanie wielu kolumn PO określonej kolumnie w MySQL