231

我在做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回来。有任何想法吗?

非常感谢!

4

6 回答 6

423

GROUP_CONCAT具有 DISTINCT 属性:

SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ') FROM table
于 2010-06-21T09:41:11.713 回答
64

使用 DISTINCT 将起作用

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

参考:-这个

于 2010-06-21T09:44:10.340 回答
43

DISTINCT: 会给你独特的价值。

SELECT GROUP_CONCAT(DISTINCT(categories )) AS categories FROM table
于 2019-04-02T10:55:58.953 回答
21

此问题的其他答案不返回 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;

在此处查看小提琴。

于 2013-09-11T13:38:26.843 回答
16

您可以简单地在前面添加DISTINCT 。

SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')

如果你想排序,

SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ')
于 2019-04-01T07:04:36.957 回答
12
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

于 2017-02-03T10:26:40.383 回答