关于GROUP_CONCAT()的MySQL DISTINCT

时间:2010-06-21 09:37:13

标签: mysql group-concat

我在做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。有什么想法吗?

非常感谢!

7 个答案:

答案 0 :(得分:318)

GROUP_CONCAT有DISTINCT属性:

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

答案 1 :(得分:42)

使用DISTINCT将起作用

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

参考: - this

答案 2 :(得分:16)

此问题的其他答案不会返回OP需要的内容,它们将返回如下字符串:

test1 test2 test3 test1 test3 test4

(注意test1test3是重复的),而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

然后我们可以使用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;

请参阅小提琴here

答案 3 :(得分:10)

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

答案 4 :(得分:5)

DISTINCT:将为您提供独特的价值。

SELECT GROUP_CONCAT(DISTINCT(categories )) AS categories FROM table

答案 5 :(得分:1)

我意识到这个问题已经过时了,但我觉得应该提到这一点:group_concat with distinct = performance killer。如果您在小型数据库中工作,您将无法注意到,但是当它扩展时 - 它将无法正常工作。

答案 6 :(得分:1)

您只需在前面添加 DISTINCT

SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')

如果要排序,

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