GROUP_CONCAT()上的MySQL DISTINCT

我正在做SELECT GROUP_CONCAT(categories SEPARATOR ' ') FROM table 。 下面的示例数据:

 categories ---------- test1 test2 test3 test4 test1 test3 test1 test3 

但是,我得到test1 test2 test3 test4 test1 test3回来,我想获得test1 test2 test3 test4回来。 有任何想法吗?

非常感谢!

GROUP_CONCAT具有DISTINCT属性:

 SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ') FROM table 

使用DISTINCT将工作

 SELECT GROUP_CONCAT(DISTINCT(categories) SEPARATOR ' ') FROM table 

REf: – 这个

这个问题的其他答案不返回OP所需要的,他们将返回一个string,如:

 test1 test2 test3 test1 test3 test4 

(注意test1test3是重复的),而OP想要返回这个string:

 test1 test2 test3 test4 

这里的问题是string"test1 test3"是重复的,只插入一次,但是所有其他的都是不同的( "test1 test2 test3"不同于"test1 test3" ,即使一些testing包含在整个string被复制)。

我们在这里需要做的是将每个string拆分成不同的行,我们首先需要创build一个数字表:

 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 

然后我们可以使用DISTINCT子句应用GROUP_CONCAT聚合函数:

 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; 

请看这里的小提琴。

 SELECT GROUP_CONCAT(DISTINCT (category)) 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; 

这将返回不同的值,如: test1,test2,test4,test3

我意识到这个问题是旧的,但我觉得应该提到:group_concat with distinct = performance killer。 如果你在小型数据库中工作,你不会注意到,但是当它扩展时,它将不能很好地工作。