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)
và
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.