Другие ответы на этот вопрос не возвращают то, что потребности О.П., они будут верните строку как:
test1 test2 test3 test1 test3 test4
(обратите внимание, что test1
и test3
дублируются), а ОП хочет вернуть эту строку:
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, нас ING 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;
Пожалуйста, смотрите скрипку here.
Похоже, что ваша интерпретация вопроса OP может быть правильной; однако, я думаю, следует отметить, что нормализация данных путем создания таблицы «blah_to_categories» и «категорий» для соответствующих отношений «многие ко многим» была бы лучшей практикой здесь и добавила бы большую гибкость. Тем не менее, ваш ответ - умное решение для любого, кто наследует такую денормализованную схему. Вероятно, он также может быть адаптирован с целью генерации перехода от старой к нормированной схеме. – XP84