mysql 列换行 表设计 设计_mysql 列转行的技巧(分享)
前言:
由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式。即同一个列中存储了多个属性值(具体结构见下表)。
这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列转行的结果。
表数据:
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 列转行的技巧(分享)相关推荐
- MySQL之数据库表的设计
MySQL之数据库表的设计 一.表与表关系分类 1.一对多 2.多对多 3.一对一 二.表与表关系设计 1.创建四张表 2.表间关系分析: 3.设计例子 三.数据库范式 1.什么是范式? 2.函数依赖 ...
- mysql如何把列转行_mysql列转行的技巧(分享)
前言: 由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式.即同一个列中存储了多个属性值(具体结构见下表). 这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列转行的结果 ...
- mysql 列换行 表设计 设计_MySql行转列、列转行
现mysql中有一张表php_user表,表结构为: 表中数据有: 现在想查询出来不同学生的语数外成绩在一行显示,那么需要用到行转列的用法, 一.行转列 1.使用case...when....then ...
- mysql 列换行 表设计 设计_今天来讲一下怎么利用MySql进行库表设计
今天来讲一下怎么利用MySql进行库表设计 1 引擎选择 在 mysql 5.1 中,引入了新的插件式存储引擎体系结构,允许将存储引擎加载到正在运新的 mysql 服务器中.使用 mysql 插件式存 ...
- mysql中修改表结构语法_MySQL表结构修改详解
MySQL修改表的语法 ========================= 增加列[add 列名] ========================= ①alter table 表名 add 列名 列 ...
- mysql 两张表合并查询_mysql中的分区表和合并表详解(一个常见知识点)
分区表是mysql5.1之后的新特性,合并表已经存在很长时间了.这篇文章主要介绍这两个概念以及他们基本的操作. 一.合并表 合并表说实话是一种将要被淘汰的技术,但是掌握了合并表的概念再去看分区表就比较 ...
- mysql两个表查询修改_MySQL:查询、修改(二)
干货: 使用SELECT查询的基本语句SELECT * FROM 可以查询一个表的所有行和所有列的数据.SELECT查询的结果是一个二维表. 使用SELECT *表示查询表的所有列,使用SELECT ...
- mysql 为数据表添加字段_MySQL数据表添加字段实例
MySQL 允许在开头.中间和结尾处添加字段.针对不同的位置,MySQL数据表添加字段的方式也有所不同,下面我们一起来看MySQL数据表添加字段的实例,方便我们理解MySQL数据表添加字段的方式. M ...
- mysql查询单表的销售额_MYSQL select语句的单表查询
MYSQL select语句的单表查询 发布时间:2020-05-29 13:19:48 来源:亿速云 阅读:131 作者:Leah 这篇文章运用了实例代码展示select语句的单表查询的用法,代码非 ...
最新文章
- Angular应用中tsconfig.json文件配置说明及配置全局路径映射
- SQL数据分析概览——Hive、Impala、Spark SQL、Drill、HAWQ 以及Presto+druid
- HDU 2859 Phalanx
- 窗口分析函数_4_计算累加值
- QPS、TPS、RT、并发量、 吞吐量
- 常用的正则化方法总结
- 微信iOS 7.0.9版本更新:今天的朋友圈是一片欢乐的海洋!
- python编程(指针)
- 基于张量秩一分解的多目标跟踪方法
- wireshark找不到接口_wireshark网络小故障分析定位
- 小米回应“海量备货致亏损”;美团饿了么“偷听”?苹果发布新 iPad | 极客头条...
- java线程池饱和策略_干货:Java几种线程池的分析和使用。
- ROG幻14 AMD R7-4800H VM16安装macOS Catalina 10.15教程
- Anaconda Python安装,Spyder汉化及调试
- Mac Appium 安装
- Halcon教程七:简单的回形针识别案例
- 2019年江苏卷数学高考真题Word版含答案解析
- 按照斗地主的规则,完成洗牌发牌的动作。
- “VBE6EXT.OLB不能被加载”解决方法
- Redis - 哨兵机制与主从切换
热门文章
- 【树的四种遍历方法(遍历排序二叉树)】
- 【双子真经】详解五种不同周期的双子——双子巨蟹座(6/19-6/24)
- C++ 0x 即将夭折的新关键字 constexpr 为 VS 2010 拒绝
- python k-means聚类算法 物流分配预测实战(超详细,附源码)
- 5G网络的组成:核心网、回传和前传网络、无线接入网
- php imagestring 字太小,PHP imagestring()函数使用方法
- ElasticSearch千万级数据同步方案
- Infor ERP介绍
- 印章管理系统java_基于jsp的文章管理系统-JavaEE实现文章管理系统 - java项目源码...
- 宏景出席第十届全国工程建设信息化论坛