Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Hợp nhất hai cột, nhiều hàng bỏ qua các bản sao - MySQL

Bạn có thể làm điều đó với câu lệnh này (không, nó trông không đẹp), giả sử tên bảng của bạn là 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 = ''
;

Bản trình diễn của câu lệnh SELECT

Giải thích

Về cơ bản, tôi đã điều chỉnh phương pháp trong tổng số peterm để hoàn thành việc phân chia. Tôi phải xóa * bên ngoài đầu tiên của TRIM.

Để cho phép chuỗi trống làm giá trị cột, tôi đã thêm cấu trúc CASE để loại bỏ các giá trị như vậy. Nếu cột của bạn có giá trị NULL thay vào đó, bạn có thể thay CASE bằng

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 (không có từ khóa ALL) của cấu trúc này sẽ cung cấp cho chúng tôi danh sách các giá trị màu riêng biệt và với id GROUP BY và GROUP_CONCAT, chúng tôi sẽ nhận được danh sách giá trị được phân tách *. Cuối cùng, chúng tôi thêm một * đầu và cuối để phù hợp với yêu cầu của bạn.

Đối với bản cập nhật, bạn phải sửa đổi lựa chọn để nó chỉ trả về một cột với một hàng (với mệnh đề where).

Lưu ý

Như đã nêu bởi peterm, điều này sẽ cho phép tối đa 100 giá trị trong danh sách giá trị của bạn. Tôi không tin rằng bạn sẽ cần nhiều hơn, nhưng nếu bạn muốn, thì bạn phải điều chỉnh việc tạo ra những con số theo nhu cầu của bạn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không chuyển đổi được từ loại [java.lang.Object []] sang loại [@ org.springframework.data.jpa.repository.Query

  2. trình điều khiển oledb mysql

  3. Cách tốt nhất để liên kết các giá trị thập phân / kép / float với PDO trong PHP là gì?

  4. python pymysql.err.OperationalError:(2013, 'Mất kết nối với máy chủ MySQL trong khi truy vấn')

  5. Tại sao tôi không thể hiển thị cùng một kết quả hai lần bằng cách sử dụng mysqli_fetch_assoc?