由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式,即同一个列中存储了多个属性值。这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列转行的结果:这里使用substring_index函数进行处理

建表语句:

 DROP table if EXISTS tbl_name;
CREATE TABLE tbl_name(
id int(11) not null auto_increment,
userName varchar(100) not null,
PRIMARY KEY(id)
)
ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; insert into tbl_name values (1,'a,aa,aaa');
insert into tbl_name values (2,'b,bb');
insert into tbl_name values (3,'c,cc');

如下图:

sql语句:

 SELECT a.id,SUBSTRING_INDEX(SUBSTRING_INDEX(a.userName,',',b.help_topic_id+1),',',-1) as name
from tbl_name a left join mysql.help_topic b
on b.help_topic_id < (LENGTH(a.userName)-LENGTH(REPLACE(a.userName,',',''))+1)
ORDER BY a.id;

执行结果:

分析如下:

LENGTH(a.userName)-LENGTH(REPLACE(a.userName,',',''))+1

表示了按逗号分割后,获得行转成列的数量,以下简称n;

根据id进行循环

{
  判断:i 是否 <= n
    {
      获取最靠近第 i 个逗号之前的数据, 即 SUBSTRING_INDEX(SUBSTRING_INDEX(a.userName,',',b.help_topic_id+1),',',-1)
      i = i +1
    }
  id = id +1
}

总结:

这种方法的缺点在于,我们需要一个拥有连续数列的独立表。并且连续数列的最大值一定要大于符合分割的值的个数。当然,mysql内部也有现成的连续数列表可用。如mysql.help_topic: help_topic_id 共有504个数值,一般能满足于大部分需求了。

最新文章

  1. Hadoop之Storm命令
  2. 2016 Multi-university training contest
  3. RMQ(范围最值问题)算法学习
  4. ios cocos2d TexturePacker生成文件后的使用方法
  5. Linux Shell脚本面试25问
  6. jquery、js全选反选checkbox
  7. Javascript之return
  8. CODEVS 3279 奶牛的健美操
  9. Qt 外观之一 ——Qt Style Sheet
  10. C# 动态加载卸载 DLL
  11. iptables命令提取总结,包含扩展模块&lt;取自朱双印博客&gt;
  12. python之模块2
  13. 【BZOJ5019】[SNOI2017]遗失的答案(FWT,动态规划)
  14. GYM 101673 A - Abstract Art 多个一般多边形面积并
  15. EF6 DbModelBuilder
  16. Architecture.SOLID-Principles
  17. SphereFace的原理
  18. python 复数的数学四则运算
  19. Visual Studio自动生成XML类和JSON类
  20. [CF620E]New Year Tree

热门文章

  1. 命令行部署SharePoint2016离线前提条件和添加服务器的Feature
  2. wpgcms---循环导航
  3. python使用微信推送消息
  4. 22.2、react生命周期与react脚手架(二)
  5. 目前常用的加密算法有DES(Data Encryption Standard)和IDEA(International Data Encryption Algorithm)国际数据加密算法等,请用工厂方法实现加密算法系统。提交该系统的代码,该系统务必是一个可以能够直接使用的系统,查阅资料完成相应加密算法的实现;
  6. Java进程与线程的区别
  7. PAT甲级1057 Stack【树状数组】【二分】
  8. F#周报2019年第5期
  9. Luogu 1068 - 分数线划定 - [快速排序]
  10. 转 消息中间件:RocketMQ 介绍(特性、术语、原理、优缺点、消息顺序、消息重复)