Các câu trả lời khác cho câu hỏi này không trả về những gì OP cần, họ sẽ trả về một chuỗi như:
test1 test2 test3 test1 test3 test4
(lưu ý rằng test1
và test3
được nhân đôi) trong khi OP muốn trả về chuỗi này:
test1 test2 test3 test4
vấn đề ở đây là chuỗi "test1 test3"
được sao chép và chỉ được chèn một lần, nhưng tất cả các chuỗi khác là khác biệt với nhau ( "test1 test2 test3"
khác biệt hơn "test1 test3"
, ngay cả khi một số thử nghiệm có trong toàn bộ chuỗi được sao chép).
Điều chúng ta cần làm ở đây là chia mỗi chuỗi thành các hàng khác nhau và trước tiên chúng ta cần tạo một bảng số:
CREATE TABLE numbers (n INT);
INSERT INTO numbers VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
sau đó chúng ta có thể chạy truy vấn này:
SELECT
SUBSTRING_INDEX(
SUBSTRING_INDEX(tableName.categories, ' ', numbers.n),
' ',
-1) category
FROM
numbers INNER JOIN tableName
ON
LENGTH(tableName.categories)>=
LENGTH(REPLACE(tableName.categories, ' ', ''))+numbers.n-1;
và chúng tôi nhận được một kết quả như thế này:
test1
test4
test1
test1
test2
test3
test3
test3
và sau đó chúng ta có thể áp dụng hàm tổng hợp GROUP_CONCAT, sử dụng mệnh đề DISTINCT:
SELECT
GROUP_CONCAT(DISTINCT category ORDER BY category SEPARATOR ' ')
FROM (
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(tableName.categories, ' ', numbers.n), ' ', -1) category
FROM
numbers INNER JOIN tableName
ON LENGTH(tableName.categories)>=LENGTH(REPLACE(tableName.categories, ' ', ''))+numbers.n-1
) s;
Xin vui lòng xem fiddle ở đây .