mysql列转行的技巧实例分享
技术百科
黄舟
发布时间:2017-03-25
浏览: 次 下面小编就为大家带来一篇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
# 做个
# 笛卡尔
# 来实现
# 看看吧
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- c++怎么使用类型萃取type_traits_c+
- Golang如何遍历目录文件_Golang fil
- Win11系统更新后黑屏怎么办 Win11更新黑屏
- Windows 11怎么设置默认解压软件_Wind
- 如何在Golang中处理通道发送接收错误_防止阻塞
- php修改数据怎么改富文本_update更新htm
- Mac如何修改Hosts文件?(本地开发与屏蔽网站
- PHP主流架构如何做单元测试_工具与流程【详解】
- c++ namespace命名空间用法_c++避免
- PHP 中 require() 语句返回值的用法详
- 微信里的php文件怎么变mp4_微信接收php转m
- php增删改查在php8里有什么变化_新特性对cu
- Windows 10自带杀毒软件在哪_Window
- Win11怎么设置右键刷新选项_Windows11
- PythonPandas数据分析项目教程_时间序列
- php中$this和::能混用吗_对象与静态作用域
- Win11怎么关闭自动更新 Win11永久关闭系统
- 如何使用Golang实现文件追加操作_向已有文件追
- 使用类变量定义字符串常量时如何实现类型安全的 Li
- 如何使用Golang处理静态文件缓存_提高页面加载
- 如何使用Golang实现基本类型比较_Golang
- 如何使用正则表达式提取以编号开头、后跟多个注解的完
- Win11如何暂停系统更新 Win11暂停更新最长
- Win10怎么查看内存时序参数_Win10CPU-
- Windows怎样关闭桌面弹窗广告_Windows
- Win10任务栏天气和资讯怎么关闭 Win10禁用
- Win11如何设置开机问候语 Win11修改登录界
- mac怎么安装字体_MAC添加第三方字体与字体册管
- 如何使用Golang实现容器健康检查_监控和自动重
- Python与GPU加速技术_CUDA与Numba
- php中作用域操作符能访问私有静态属性吗_访问权限
- MAC怎么在照片中添加水印_MAC自带编辑工具文字
- 如何在Golang中解压文件_Golang com
- Win11怎么关闭应用权限_Windows11相机
- 零基础学会Python自动化办公_高效处理Exce
- Win11怎么设置虚拟内存_Windows 11优
- Win11如何设置文件权限 Win11 NTFS文
- Win10怎样清理C盘Steam游戏缓存_Win1
- windows 10专注助手怎么关闭_window
- Windows家庭版如何开启组策略(gpedit.
- Python解释执行模型_字节码流程说明【指导】
- Win11怎么设置虚拟内存最佳大小_Windows
- php485返回空数组怎么回事_php485数据接
- Drupal 中渲染节点时出现 HTML 标签嵌套
- Python模块的__name__属性如何由导入方
- Windows10系统服务优化指南_Win10禁用
- php怎么下载安装后设置默认字符集_utf8配置步
- 为什么Go建议使用error接口作为错误返回_Go
- 如何使用正则表达式批量替换重复的星号-短横模式为固
- Win11怎么设置桌面图标间距_Windows11

toIncreID <= (length(a.mSize) - length(replace(a.mSize,',',''))+1)
order by a.ID;
QQ客服