博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL逗号分割字段的行列转换技巧
阅读量:5141 次
发布时间:2019-06-13

本文共 875 字,大约阅读时间需要 2 分钟。

SELECT GROUP_CONCAT(REPLACE(path,'/',',')) AS path FROM department b WHERE department_type = 1

执行结果:

 

 

 sql:

SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(a.path,',',b.help_topic_id + 1),',',-1)   FROM   (SELECT GROUP_CONCAT(REPLACE(path,'/',',')) AS path FROM department b WHERE department_type = 1) aJOIN  mysql.help_topic b  ON b.help_topic_id < (LENGTH(a.path) - LENGTH(REPLACE(a.path,',','')) + 1)

执行结果:

 

原理分析:

这个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个数值,一般能满足于大部分需求了。

转载于:https://www.cnblogs.com/tooy/p/8108602.html

你可能感兴趣的文章
深入研究java.lang.Process类
查看>>
数字签名的原理
查看>>
知识创造价值
查看>>
精简六法则
查看>>
MD5加密方法
查看>>
HDU 1021 Fibonacci Again
查看>>
基本包装模式
查看>>
软件需求模式阅读笔记02
查看>>
os引导程序boot从扇区拷贝os加载程序loader文件到内存(boot copy kernel to mem in the same method)...
查看>>
Session超时和丢失,如何让Sessioon永不过期
查看>>
centos7 增加tomcat开机 启动
查看>>
python拓扑排序
查看>>
绘制摆线
查看>>
微信小程序项目一(小程序配置)
查看>>
正则表达式学习
查看>>
linux 之centos6.3 安装中文输入法
查看>>
hdu.5211.Mutiple(数学推导 && 在logn的时间内求一个数的所有因子)
查看>>
Global.asax 文件是什么(转)
查看>>
CircularSlider半弧形滑动条
查看>>
iOS中的分类(category)和类扩展(extension)
查看>>