MySQL根据逗号将一行数据拆成多行数据

原始数据

 

 

 处理结果展示

 

 

 DDL

CREATE TABLE `company` (
`id` int(20) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`shareholder` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DML

INSERT INTO `company` VALUES ('1', '阿里巴巴', '马云'); 
INSERT INTO `company` VALUES ('2', '淘宝', '马云,孙正义');
INSERT INTO `company` VALUES ('2', '淘宝', '马云,孙正义,茅五');

三种方式,相同的原理

1.使用MySQL库中的自增序列表

复制代码
SELECT
    a.id,
    a. NAME,
    substring_index(
        substring_index(
            a.shareholder,
            ',',
            b.help_topic_id + 1
        ),
        ',' ,- 1
    ) AS shareholder
FROM
    company a
JOIN mysql.help_topic b ON b.help_topic_id < (
    length(a.shareholder) - length(
        REPLACE (a.shareholder, ',', '')
    ) + 1
)
复制代码

2.自建自增序列表

CREATE TABLE `addself` (
`id` int(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `addself` VALUES ('0'); 
INSERT INTO `addself` VALUES ('1');
INSERT INTO `addself` VALUES ('2');
INSERT INTO `addself` VALUES ('3');
INSERT INTO `addself` VALUES ('4');
复制代码
SELECT
    a.id,
    a.NAME,
    substring_index(
        substring_index(
            a.shareholder,
            ',',
            b.id+ 1
        ),
        ',' ,- 1
    ) AS shareholder
FROM
    company a
JOIN addself b ON b.id< (
    length(a.shareholder) - length(
        REPLACE (a.shareholder, ',', '')
    ) + 1
)
复制代码

3.以数据库里已有表,构建自增序列表

select a.ID,a.name,substring_index(substring_index(a.shareholder,',',b.id+1),',',-1) shareholder
from
company a
join
(SELECT (@ROW :=@Row + 1) as id FROM xh,(SELECT @Row:=-1) zz) b
on b.id < (length(a.shareholder) - length(replace(a.shareholder,',',''))+1);

 

posted @   爱学习的小猫咪  阅读(976)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示