MySQL DISTINCT на GROUP_CONCAT ()


185

Я роблю 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 повернутися. Будь-які ідеї?

Велике дякую!

Відповіді:



48

Використання DISTINCT спрацює

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

REF: - це



17

Інші відповіді на це запитання не повертають те, що потрібно ОП, вони повернуть рядок типу:

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;

Будь ласка, дивіться тут скрипку .


Здається, ваше тлумачення питання ОП може бути правильним; однак, я думаю, слід зазначити, що нормалізація даних шляхом створення "blah_to_categories" та "категорії" таблиці для відповідних відносин "багато-багато" була б найкращою практикою тут і додала б великої гнучкості. Тим не менш, ваша відповідь є розумним рішенням для кожного, хто успадковує таку денормалізовану схему. Можливо, він також може бути адаптований з метою генерування міграції зі старої до нормалізованої схеми.
XP84

11
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

Ви можете просто додати DISTINCT попереду.

SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')

якщо ви хочете сортувати,

SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.