DISTINCT Выберите значения, разделенные запятыми MySQL [дубликаты]

В настоящее время у меня есть эта таблица yeast_module, в которой есть это поле beer_style

Что в настоящее время каждая отдельная строка в yeast_module имеет эти beer_style данные

American Amber,American Brown Ale,American India Pale Ale,American Pale Ale,American Porter,American Stout,Barleywine Ale,Belgian Dark Strong Ale,Belgian Table Bier,Belgian Wit,Blonde Ale,Cream Ale,Dusseldorf Altbier,English Brown Ale,English India Pale A

Теперь мне интересно, могу ли я разделить его и выделить отчетливо.

Я играю с этой командой

SELECT DISTINCT beer_style FROM yeast_module

Мой ожидаемый результат

  American Amber,
  American Brown Ale,
  So on..

Вот пример данных, которые у меня есть: введите здесь описание изображения


person Rae Ian    schedule 27.08.2020    source источник


Ответы (1)


То, как вы храните свои данные, делает эту задачу утомительной (и по своей сути неэффективной). Хранение списков csv в столбце таблицы — типичный антипаттерн SQL, которого почти всегда следует избегать.

Вместо этого у вас должна быть отдельная таблица для представления отношения «один ко многим» между модулями дрожжей и стилями пива, с каждым кортежем значений в отдельной строке.

Если вы используете MySQL 8.0, вы можете использовать рекурсивный запрос, чтобы разделить строку на строки:

with recursive cte as (
    select 
        substring(beer_style, 1, locate(',', concat(beer_style, ',')) - 1) parsed,
        substring(concat(beer_style, ','), locate(',', concat(beer_style, ',')) + 1) remaining
    from mytable
    union all
    select 
        substring(remaining, 1, locate(',', remaining) - 1),
        substring(remaining, locate(',', remaining) + 1)
    from cte
    where locate(',', remaining) > 0
)
select parsed from cte

Рекомендуемая литература: Действительно ли плохо хранить список с разделителями в столбце базы данных?

person GMB    schedule 27.08.2020
comment
На данный момент я пытаюсь получить его как отдельный, чтобы я мог получить весь список beer_style и создать таблицу для списка beer_style, чтобы иметь свой собственный первичный ключ и назначить его yeast_module соответственно, чтобы упростить запрос, спасибо за ваше отвечать - person Rae Ian; 28.08.2020
comment
@RaeIan: точно такой же запрос с select distinct parsed from cte. - person GMB; 28.08.2020