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 обратно. Любые идеи?

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


person user371990    schedule 21.06.2010    source источник


Ответы (6)


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

SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ') FROM table
person Naktibalda    schedule 21.06.2010

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

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

REf: - это

person Salil    schedule 21.06.2010

DISTINCT: даст вам уникальные значения.

SELECT GROUP_CONCAT(DISTINCT(categories )) AS categories FROM table
person Goshika Mahesh    schedule 02.04.2019

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

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

person fthiella    schedule 11.09.2013
comment
Похоже, ваша интерпретация вопроса OP может быть правильной; однако я думаю, что следует указать, что нормализация данных путем создания blah_to_categories и таблицы категорий для соответствующего отношения «многие ко многим» была бы лучшей практикой здесь и добавила бы большую гибкость. Тем не менее, ваш ответ - умный обходной путь для всех, кто наследует такую ​​денормализованную схему. Его также, вероятно, можно было бы адаптировать с целью создания перехода от старой схемы к нормализованной. - person XP84; 01.06.2016

Вы можете просто добавить DISTINCT впереди.

SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')

если вы хотите отсортировать,

SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ')
person Mohideen bin Mohammed    schedule 01.04.2019

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

person Sainath    schedule 03.02.2017