文档章节

Mysql group_concat的反向应用实现(Mysql列转行)

pangdaTv
 pangdaTv
发布于 2016/04/26 15:11
字数 402
阅读 41
收藏 0

分类: Mysql/postgreSQL

用过Mysql的都知道她有一个很好的实现行转列功能的函数group_concat函数,非常方便

点击(此处)折叠或打开

  1. SELECT

  2.     *

  3. FROM

  4.     group_test;

  5.  

  6. SELECT

  7.     id,

  8.     GROUP_CONCAT(sub_id)

  9. FROM

  10.     `group_test`

  11. GROUP BY

  12.     id;







现在的需求是有上面图二类似的结果集,需要把列二拆分 转换成行记录


我们知道如果是单条记录通过SUBSTRING_INDEX容易实现


点击(此处)折叠或打开

  1. select id,SUBSTRING_INDEX(sub_id,',',1) from group_test where id=3

  2. UNION

  3. select id,SUBSTRING_INDEX(SUBSTRING_INDEX(sub_id,',',2),',',-1) from group_test where id=3

  4. UNION

  5. select id,SUBSTRING_INDEX(SUBSTRING_INDEX(sub_id,',',3),',',-1) from group_test where id=3


但是如果是N条呢?同样也是可以使用SUBSTRING_INDEX来实现,只不过需要一个配置表,通过CROSS JOIN交叉连接实现,先看下CROSS JOIN

点击(此处)折叠或打开

  1. SELECT

  2.     *

  3. FROM

  4.     (SELECT 1 UNION SELECT 2) t1

  5. CROSS JOIN (SELECT 3 UNION SELECT 4) t2



下面就通过CROSS JOIN和SUBSTRING_INDEX实现我们的需求,首先构建一个配置表


点击(此处)折叠或打开

  1. CREATE TABLE digits (digit INT(1));

  2. INSERT INTO digits

  3. VALUES

  4.     (0),

  5.     (1),

  6.     (2),

  7.     (3),

  8.     (4),

  9.     (5),

  10.     (6),

  11.     (7),

  12.     (8),

  13.     (9);

  14. CREATE TABLE sequence (seq INT(3));

  15. INSERT INTO sequence (

  16.     SELECT

  17.         D1.digit + D2.digit * 10

  18.     FROM

  19.         digits D1

  20.     CROSS JOIN digits D2

  21. );

然后


点击(此处)折叠或打开

  1. SELECT

  2.     id,

  3.     SUBSTRING_INDEX(

  4.         SUBSTRING_INDEX(sub_id, ',', seq),

  5.         ',' ,- 1

  6.     ) sub_id,

  7.     seq

  8. FROM

  9.     sequence

  10. CROSS JOIN group_test

  11. WHERE

  12.     seq BETWEEN 1

  13. AND (

  14.     SELECT

  15.         1 + LENGTH(sub_id) - LENGTH(REPLACE(sub_id, ',', ''))

  16. )

  17. ORDER BY

  18.     id,

  19.     sub_id;




然后就没有然后了。如图上的代码 有几个地方使用还是很巧妙的 不是吗?
最后此方法是不是比写个存储过程或者PHP/PYTHON简单些呢^_^

本文转载自:http://blog.chinaunix.net/uid-411974-id-3990697.html

pangdaTv
粉丝 2
博文 63
码字总数 2263
作品 0
成都
程序员
私信 提问
MYSQL函数group_concat的使用

今天对一批数据要迁移转换,查了下,有group_concat这个函数简单实现字段的列转行设置,过程记录如下 一.测试数据准备 mysql> use test;Database changedmysql> select * from t_kenyon;+---...

kenyon_君羊
2012/08/02
0
8
oracle迁移mysql总结

最近我处理了一个项目的数据库迁移,从oracle迁移至mysql,其中的一项主要工作就是对代码中的sql进行改写。这里针对两个库的不同点做一下总结,以备后查。 oracle与mysql之常用函数的区别: ...

SawyerZhou
2017/12/08
0
0
mysql 处理行转列,一种野路子解决方案

在使用 mysql 实现行转列的,要就是静态的,自己手写列,动态的太复杂容易出错,为了行转列写个存储过程好像没必要。 mysql 关键字中有这么几个函数 CONCAT_WS 合并列,可以是多个字段,中间...

小鸟00
2018/09/06
0
0
Easyui动态显示列的应用实例

1、前言 项目中一个考勤信息功能,考勤信息的数据表结构如下: 考勤表数据如下图: 客户要求实现的界面样式如下图: 说明:根据年月查询店铺员的考勤信息,每个月份的天数是不一样的,5月份3...

ytangdigl
2017/06/17
0
0
hive语句和mysql用法区别存档

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/quiet_girl/article/details/85246416 写在前面 mysql和hive版本: mysql版本:5.6.17 hive版本:2.1.1 一、G...

nana-li
2018/12/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

面试爱奇艺,竟然挂在第5轮……

今天给大家分享我曾经在爱奇艺的面试,过程还是比较有意思的,可以给大家一些参考 <br> 聊骚阶段 嗲妹妹:你好,我是爱奇艺的HR,我们正在招聘运维开发岗位,请问您最近有在看工作机会吗? ...

上海小胖
27分钟前
0
0
Jenkins系列_插件安装及报错处理

进入Jenkins之后我们可以进行插件的安装,插件管理位于以下模块: 发现上面报了一堆错误,是因为插件的依赖没有安装好,那么这一节,就先把这些错误解决掉吧。解决完成后,也就基本会使用插件...

shzwork
今天
2
0
mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)

查询所有字段 select * from 表名; 查询自定字段 select 字段名 from 表名; 查询指定数据 select * from 表名 where 条件; 带关键字IN的查询 select * from 表名 where 条件 [not] in(元素...

edison_kwok
昨天
9
0
解决多线程并行加载缓存问题(利用guava实现)

依赖 com.google.guava:guava:20.0 import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import java.util.concurrent.ExecutionException;import j......

暗中观察
昨天
4
0
利用VisualVM 内存查看

准备工作,建几个测试类。等下就是要查看这几个类里面的属性 package visualvm;public class MultiObject { private String str; private int i; MultiObject(String str...

冷基
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部