Mysql 逗号分隔值上的DISTINCT Select

Mysql 逗号分隔值上的DISTINCT Select,mysql,sql,csv,recursive-query,unnest,Mysql,Sql,Csv,Recursive Query,Unnest,目前我有一个表酵母模块,它有这个字段啤酒风格 目前,yeast_模块中的每一行都有这个beer_样式数据 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

目前我有一个表
酵母模块
,它有这个字段
啤酒风格

目前,
yeast_模块中的每一行
都有这个
beer_样式
数据

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
现在,我想知道我是否可以拆分它并清楚地选择它

我在玩这个命令

从酵母模块中选择不同的啤酒风格

我的预期产出是

  American Amber,
  American Brown Ale,
  So on..
这是我的样本数据

存储数据的方式使这类任务变得单调乏味(而且效率低下)。在表列中存储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

推荐阅读:

目前,我正在尝试将其区分开来,这样我就可以获得所有
啤酒风格的列表
,并为
啤酒风格的列表
创建一个表,使其具有自己的主键,并相应地将其分配到
酵母模块
,以使查询更容易。感谢您的支持answer@RaeIan:相同的查询,使用
选择distinct parsed from cte