Ответ 1
GROUP_CONCAT имеет атрибут DISTINCT:
SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ') FROM table
Я делаю 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
назад. Любые идеи?
Большое спасибо!
GROUP_CONCAT имеет атрибут DISTINCT:
SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ') FROM table
Использование DISTINCT будет работать
SELECT GROUP_CONCAT(DISTINCT(categories) SEPARATOR ' ') FROM table
REf: - this
Другие ответы на этот вопрос не возвращают то, что требуется 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;
Смотрите здесь скрипку здесь.
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
Я понимаю, что этот вопрос старый, но мне кажется, что это следует упомянуть: group_concat с отличным = убийцей производительности. Если вы работаете в небольших базах данных, вы не заметите, но когда он масштабируется - он не будет работать очень хорошо.