场景描述:
日常参与项目会遇到各种各样的数据格式。有时候会有特殊情况如下
可以看到id与ids字段之间的关系是1:n的。这时候我们可能就会有需求 需要我们将一行数据拆分为多行。
先提供测试数据
CREATE TABLE `tmp` (`id` int NOT NULL AUTO_INCREMENT,`ids` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `tmp`( `ids`) VALUES (‘a,b,c,d’),(‘ab,ac’),(‘q,w,e’);
本文方法是借助了MySql系统库(mysql)中help_topic的help_topic_id 。
简单介绍一下 help_topic
该表提供查询帮助主题给定关键字的详细内容(详细帮助信息)
表字段含义:
help_topic_id:帮助主题详细信息在表记录中对应的ID
name:帮助主题给定的关键字名称,与help_keyword表中的name字段值相等
help_category_id:帮助主题类别ID,与help_category表中的help_category_id字段值相等
description:帮助主题的详细信息(这里就是我们通常查询帮助信息真正想看的内容,例如:告诉我们某某语句如何使用的语法与注意事项等)
example:帮助主题的示例信息(这里告诉我们某某语句如何使用的示例)
进入正题
SELECT a.id, substring_index( substring_index( a.ids, ‘,’, b.help_topic_id 1 ), ‘,’,- 1 ) operate_area_ids FROM tmp aJOIN mysql.help_topic b ON b.help_topic_id < ( length( a.ids ) – length( REPLACE ( a.ids, ‘,’, ” ) ) 1 ) ;
得到结果
细心的小伙伴会发现mysql.help_topic.help_topic_id 只有687行。如果遇到极端情况 我们需要拆分的数据超过687,那么我们可以自建一个序列表(只有一个字段 字段值为1-10000)。我们就直接将上面sql的help_topic 替换成我们自建的序列表就可以了。
另如果需要拆分字段里的分隔符不是逗号是其它符号的话。只需要将上面substring_index 和 REPLACE里的符号替换成对应的符号即可。