Інші відповіді на це запитання не повертають те, що потрібно ОП, вони повернуть рядок типу:
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;
Будь ласка, дивіться тут скрипку .