当前位置:   article > 正文

mysql根据逗号将一行数据拆分成多行数据,顺便展示其他列

mysql根据逗号将一行数据拆分成多行数据,顺便展示其他列

1、原始数据演示

在这里插入图片描述

2.处理结果

在这里插入图片描述

 SQL展示

  1. SELECT
  2. a.id,
  3. a. NAME,
  4. substring_index(
  5. substring_index(
  6. a.shareholder,
  7. ',',
  8. b.help_topic_id + 1
  9. ),
  10. ',' ,- 1
  11. ) AS shareholder
  12. FROM
  13. company a
  14. JOIN mysql.help_topic b ON b.help_topic_id < (
  15. length(a.shareholder) - length(
  16. REPLACE (a.shareholder, ',', '')
  17. ) + 1
  18. )

建表语句

  1. CREATE TABLE `company` (
  2. `id` int(20) DEFAULT NULL,
  3. `name` varchar(100) DEFAULT NULL,
  4. `shareholder` varchar(100) DEFAULT NULL
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  6. INSERT INTO `company` VALUES ('1', '阿里巴巴', '马云');
  7. INSERT INTO `company` VALUES ('2', '淘宝', '马云,孙正义');

原理分析

这个join最基本原理是笛卡尔积。通过这个方式来实现循环。

分析:

length(a.path) - length(replace(a.path,‘,’,‘’))+1 表示了,按照逗号分割后,分割需要循环的次数。

join过程:

根据ID进行循环

{

判断:i 是否 <= n

获取最靠近第 i 个逗号之前的数据, 即 substring_index(substring_index(a.path,‘,’,b.help_topic_id),‘,’,-1)

}

这种方法的缺点在于,我们需要一个拥有连续数列的独立表。并且连续数列的最大值一定要大于符合分割的值的个数。

例如有一行的path有100个逗号分割的值,那么我们的table 就需要有至少100个连续行。

当然,mysql内部也有现成的连续数列表可用。如mysql.help_topic: help_topic_id 共有504个数值,一般能满足于大部分需求了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/268423
推荐阅读
相关标签
  

闽ICP备14008679号