此问题的其他答案不返回 OP 需要的内容,它们将返回如下字符串:
test1 test2 test3 test1 test3 test4
(注意 test1 和 test3 是重复的)而 OP 想要返回这个字符串:
test1 test2 test3 test4
这里的问题是字符串"test1 test3"被复制并且只插入一次,但是所有其他的都是不同的("test1 test2 test3"与"test1 test3"不同,即使整个中包含一些测试字符串重复)。
这里我们需要做的是将每个字符串拆分成不同的行,我们首先需要创建一个数字表:
CREATE TABLE numbers (n INT);
INSERT INTO numbers VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
然后我们可以运行这个查询:
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;
我们得到这样的结果:
test1
test4
test1
test1
test2
test3
test3
test3
然后我们可以应用 GROUP_CONCAT 聚合函数,使用 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;
请看小提琴here。