我正在做SELECT GROUP_CONCAT(categories SEPARATOR ' ') FROM table。示例数据如下:
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回来。什么好主意吗?
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
裁判:这
这个问题的其他答案不会返回OP需要的东西,它们会返回一个字符串,比如:
test1 test2 test3 test1 test3 test4
(注意test1和test3是重复的)而OP想要返回这个字符串:
test1
test3
这里的问题是字符串"test1 test3"是重复的,并且只插入一次,但所有其他字符串彼此不同("test1 test2 test3"与"test1 test3"不同,即使整个字符串中包含的一些测试是重复的)。
"test1 test3"
"test1 test2 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;
请参见小提琴在这里。
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
你可以简单地在前面添加截然不同的。
SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')
如果你想排序,
SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ')
DISTINCT:将给你唯一的值。
DISTINCT
SELECT GROUP_CONCAT(DISTINCT(categories )) AS categories FROM table