MySQL DISTINCT на 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 назад. Любые идеи?

Большое спасибо!

Ответ 1

GROUP_CONCAT имеет атрибут DISTINCT:

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

Ответ 2

Использование DISTINCT будет работать

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

REf: - this

Ответ 3

Другие ответы на этот вопрос не возвращают то, что требуется 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;

Смотрите здесь скрипку здесь.

Ответ 4

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

Ответ 5

Я понимаю, что этот вопрос старый, но мне кажется, что это следует упомянуть: group_concat с отличным = убийцей производительности. Если вы работаете в небольших базах данных, вы не заметите, но когда он масштабируется - он не будет работать очень хорошо.