前言:

由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式。即同一个列中存储了多个属性值(具体结构见下表)。

这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列转行的结果。

表数据:

ID

Value

1

tiny,small,big

2

small,medium

3

tiny,big

期望得到结果:

ID

Value

1

tiny

1

small

1

big

2

small

2

medium

3

tiny

3

big

正文:

#需要处理的表

create table tbl_name (ID int ,mSize varchar(100));

insert into tbl_name values (1,'tiny,small,big');

insert into tbl_name values (2,'small,medium');

insert into tbl_name values (3,'tiny,big');

#用于循环的自增表

create table incre_table (AutoIncreID int);

insert into incre_table values (1);

insert into incre_table values (2);

insert into incre_table values (3);

select a.ID,substring_index(substring_index(a.mSize,',',b.AutoIncreID),',',-1)

from

tbl_name a

join

incre_table b

on b.AutoIncreID <= (length(a.mSize) - length(replace(a.mSize,',',''))+1)

order by a.ID;

原理分析:

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

以下是具体问题分析:

length(a.Size) - length(replace(a.mSize,',',''))+1  表示了,按照逗号分割后,改列拥有的数值数量,下面简称n

join过程的伪代码:

根据ID进行循环

{

判断:i 是否 <= n

{

获取最靠近第 i 个逗号之前的数据, 即 substring_index(substring_index(a.mSize,',',b.ID),',',-1)

i = i +1

}

ID = ID +1

}

总结:

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

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

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

改写后如下:

select a.ID,substring_index(substring_index(a.mSize,',',b.help_topic_id+1),',',-1)

from

tbl_name a

join

mysql.help_topic b

on b.help_topic_id < (length(a.mSize) - length(replace(a.mSize,',',''))+1)

order by a.ID;

以上这篇mysql 列转行的技巧(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

mysql 列换行 表设计 设计_mysql 列转行的技巧(分享)相关推荐

  1. MySQL之数据库表的设计

    MySQL之数据库表的设计 一.表与表关系分类 1.一对多 2.多对多 3.一对一 二.表与表关系设计 1.创建四张表 2.表间关系分析: 3.设计例子 三.数据库范式 1.什么是范式? 2.函数依赖 ...

  2. mysql如何把列转行_mysql列转行的技巧(分享)

    前言: 由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式.即同一个列中存储了多个属性值(具体结构见下表). 这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列转行的结果 ...

  3. mysql 列换行 表设计 设计_MySql行转列、列转行

    现mysql中有一张表php_user表,表结构为: 表中数据有: 现在想查询出来不同学生的语数外成绩在一行显示,那么需要用到行转列的用法, 一.行转列 1.使用case...when....then ...

  4. mysql 列换行 表设计 设计_今天来讲一下怎么利用MySql进行库表设计

    今天来讲一下怎么利用MySql进行库表设计 1 引擎选择 在 mysql 5.1 中,引入了新的插件式存储引擎体系结构,允许将存储引擎加载到正在运新的 mysql 服务器中.使用 mysql 插件式存 ...

  5. mysql中修改表结构语法_MySQL表结构修改详解

    MySQL修改表的语法 ========================= 增加列[add 列名] ========================= ①alter table 表名 add 列名 列 ...

  6. mysql 两张表合并查询_mysql中的分区表和合并表详解(一个常见知识点)

    分区表是mysql5.1之后的新特性,合并表已经存在很长时间了.这篇文章主要介绍这两个概念以及他们基本的操作. 一.合并表 合并表说实话是一种将要被淘汰的技术,但是掌握了合并表的概念再去看分区表就比较 ...

  7. mysql两个表查询修改_MySQL:查询、修改(二)

    干货: 使用SELECT查询的基本语句SELECT * FROM 可以查询一个表的所有行和所有列的数据.SELECT查询的结果是一个二维表. 使用SELECT *表示查询表的所有列,使用SELECT ...

  8. mysql 为数据表添加字段_MySQL数据表添加字段实例

    MySQL 允许在开头.中间和结尾处添加字段.针对不同的位置,MySQL数据表添加字段的方式也有所不同,下面我们一起来看MySQL数据表添加字段的实例,方便我们理解MySQL数据表添加字段的方式. M ...

  9. mysql查询单表的销售额_MYSQL select语句的单表查询

    MYSQL select语句的单表查询 发布时间:2020-05-29 13:19:48 来源:亿速云 阅读:131 作者:Leah 这篇文章运用了实例代码展示select语句的单表查询的用法,代码非 ...

最新文章

  1. Angular应用中tsconfig.json文件配置说明及配置全局路径映射
  2. SQL数据分析概览——Hive、Impala、Spark SQL、Drill、HAWQ 以及Presto+druid
  3. HDU 2859 Phalanx
  4. 窗口分析函数_4_计算累加值
  5. QPS、TPS、RT、并发量、 吞吐量
  6. 常用的正则化方法总结
  7. 微信iOS 7.0.9版本更新:今天的朋友圈是一片欢乐的海洋!
  8. python编程(指针)
  9. 基于张量秩一分解的多目标跟踪方法
  10. wireshark找不到接口_wireshark网络小故障分析定位
  11. 小米回应“海量备货致亏损”;美团饿了么“偷听”?苹果发布新 iPad | 极客头条...
  12. java线程池饱和策略_干货:Java几种线程池的分析和使用。
  13. ROG幻14 AMD R7-4800H VM16安装macOS Catalina 10.15教程
  14. Anaconda Python安装,Spyder汉化及调试
  15. Mac Appium 安装
  16. Halcon教程七:简单的回形针识别案例
  17. 2019年江苏卷数学高考真题Word版含答案解析
  18. 按照斗地主的规则,完成洗牌发牌的动作。
  19. “VBE6EXT.OLB不能被加载”解决方法
  20. Redis - 哨兵机制与主从切换

热门文章

  1. 【树的四种遍历方法(遍历排序二叉树)】
  2. 【双子真经】详解五种不同周期的双子——双子巨蟹座(6/19-6/24)
  3. C++ 0x 即将夭折的新关键字 constexpr 为 VS 2010 拒绝
  4. python k-means聚类算法 物流分配预测实战(超详细,附源码)
  5. 5G网络的组成:核心网、回传和前传网络、无线接入网
  6. php imagestring 字太小,PHP imagestring()函数使用方法
  7. ElasticSearch千万级数据同步方案
  8. Infor ERP介绍
  9. 印章管理系统java_基于jsp的文章管理系统-JavaEE实现文章管理系统 - java项目源码...
  10. 宏景出席第十届全国工程建设信息化论坛