我正在从表中选择GROUP_CONCAT(类别分隔符' ')。示例数据如下:

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

但是,我得到了test1 test2 test3 test4 test1 test3,我想要得到test1 test2 test3 test4。什么好主意吗?

很多谢谢!


当前回答

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

请看这里的小提琴。

其他回答

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 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;

请看这里的小提琴。

DISTINCT:将给你唯一的值。

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

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

SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')

如果你想排序,

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