Mysql group_concat的反向应用实现(Mysql列转行)
2016-11-07 20:52
1406 查看
用过Mysql的都知道她有一个很好的实现行转列功能的函数group_concat函数,非常方便
点击(此处)折叠或打开
SELECT
*
FROM
group_test;
SELECT
id,
GROUP_CONCAT(sub_id)
FROM
`group_test`
GROUP BY
id;
现在的需求是有上面图二类似的结果集,需要把列二拆分 转换成行记录
我们知道如果是单条记录通过SUBSTRING_INDEX容易实现
点击(此处)折叠或打开
select id,SUBSTRING_INDEX(sub_id,',',1)
from group_test where id=3
UNION
select id,SUBSTRING_INDEX(SUBSTRING_INDEX(sub_id,',',2),',',-1)
from group_test where id=3
UNION
select id,SUBSTRING_INDEX(SUBSTRING_INDEX(sub_id,',',3),',',-1)
from group_test where id=3
但是如果是N条呢?同样也是可以使用SUBSTRING_INDEX来实现,只不过需要一个配置表,通过CROSS JOIN交叉连接实现,先看下CROSS JOIN
点击(此处)折叠或打开
SELECT
*
FROM
(SELECT 1 UNION
SELECT 2) t1
CROSS JOIN (SELECT 3 UNION
SELECT 4) t2
下面就通过CROSS JOIN和SUBSTRING_INDEX实现我们的需求,首先构建一个配置表
点击(此处)折叠或打开
CREATE
TABLE digits (digit
INT(1));
INSERT INTO digits
VALUES
(0),
(1),
(2),
(3),
(4),
(5),
(6),
(7),
(8),
(9);
CREATE TABLE sequence
(seq INT(3));
INSERT INTO sequence
(
SELECT
D1.digit
+ D2.digit
* 10
FROM
digits D1
CROSS JOIN digits D2
);
<
4000
/div>
然后
点击(此处)折叠或打开
SELECT
id,
SUBSTRING_INDEX(
SUBSTRING_INDEX(sub_id,
',', seq),
',' ,- 1
) sub_id,
seq
FROM
sequence
CROSS JOIN group_test
WHERE
seq BETWEEN 1
AND (
SELECT
1 + LENGTH(sub_id) -
LENGTH(REPLACE(sub_id,
',',
''))
)
ORDER BY
id,
sub_id;
然后就没有然后了。如图上的代码 有几个地方使用还是很巧妙的 不是吗?
最后此方法是不是比写个存储过程或者PHP/PYTHON简单些呢^_^
点击(此处)折叠或打开
SELECT
*
FROM
group_test;
SELECT
id,
GROUP_CONCAT(sub_id)
FROM
`group_test`
GROUP BY
id;
现在的需求是有上面图二类似的结果集,需要把列二拆分 转换成行记录
我们知道如果是单条记录通过SUBSTRING_INDEX容易实现
点击(此处)折叠或打开
select id,SUBSTRING_INDEX(sub_id,',',1)
from group_test where id=3
UNION
select id,SUBSTRING_INDEX(SUBSTRING_INDEX(sub_id,',',2),',',-1)
from group_test where id=3
UNION
select id,SUBSTRING_INDEX(SUBSTRING_INDEX(sub_id,',',3),',',-1)
from group_test where id=3
但是如果是N条呢?同样也是可以使用SUBSTRING_INDEX来实现,只不过需要一个配置表,通过CROSS JOIN交叉连接实现,先看下CROSS JOIN
点击(此处)折叠或打开
SELECT
*
FROM
(SELECT 1 UNION
SELECT 2) t1
CROSS JOIN (SELECT 3 UNION
SELECT 4) t2
下面就通过CROSS JOIN和SUBSTRING_INDEX实现我们的需求,首先构建一个配置表
点击(此处)折叠或打开
CREATE
TABLE digits (digit
INT(1));
INSERT INTO digits
VALUES
(0),
(1),
(2),
(3),
(4),
(5),
(6),
(7),
(8),
(9);
CREATE TABLE sequence
(seq INT(3));
INSERT INTO sequence
(
SELECT
D1.digit
+ D2.digit
* 10
FROM
digits D1
CROSS JOIN digits D2
);
<
4000
/div>
然后
点击(此处)折叠或打开
SELECT
id,
SUBSTRING_INDEX(
SUBSTRING_INDEX(sub_id,
',', seq),
',' ,- 1
) sub_id,
seq
FROM
sequence
CROSS JOIN group_test
WHERE
seq BETWEEN 1
AND (
SELECT
1 + LENGTH(sub_id) -
LENGTH(REPLACE(sub_id,
',',
''))
)
ORDER BY
id,
sub_id;
然后就没有然后了。如图上的代码 有几个地方使用还是很巧妙的 不是吗?
最后此方法是不是比写个存储过程或者PHP/PYTHON简单些呢^_^
相关文章推荐
- Mysql group_concat的反向应用实现(Mysql列转行)
- Mysql group_concat的反向应用实现(Mysql列转行)
- Mysql group_concat的反向应用实现(Mysql列转行)
- Mysql group_concat的反向应用如何实现?
- Mysql group_concat的反向应用实现(Mysql列转行)
- sql server 怎么实现mysql中group_concat,列转行,列用分隔符拼接字符串
- sql server 怎么实现mysql中group_concat,列转行,列用分隔符拼接字符串
- SQL 实现 Mysql Group_Concat()效果
- Sybase数据库实现等效的mysql中group_concat功能
- Sql Server中实现Mysql中的group_concat函数效果
- mysql 函数FIND_IN_SET、group_concat 、concat、cast的高级应用
- 关于Mysql group_concat的应用(把相同ID的VAL用字符'/'连接起来)
- mysql 列转行 GROUP_CONCAT
- PostgreSQL如何实现MySQL中的group_concat聚集函数(简单的拼接功能)
- MySQL的行转列、列转行、连接字符串 concat、concat_ws、group_concat函数用法
- MySQL的行转列、列转行、连接字符串 concat、concat_ws、group_concat函数用法
- MySQL中GROUP_CONCAT函数长度限制处理/实现行转列的功能
- mysql中GROUP_CONCAT的应用
- MySql中的几个小函数的应用(group_concat,concat_ws)
- MySQL中的CONCAT、CONCAT_WS、GROUP_CONCAT函数,实现多行和多列的内容放在一个单元格内