mysql列转行(列值不确定

有这样的一需求:
b列的值是不确定的,tag1—-tag50之间,但符合条件的tag最多为5个(不为空只有5个),转换成行。


root@xxx 08:17:54>select * from test;
+------------+-------+
| a | b |
+------------+-------+
| 2011-08-22 | tag1 |
| 2011-08-22 | tag2 |
| 2011-08-22 | tag3 |
| 2011-08-22 | tag30 |
| 2011-08-22 | tag40 |
| 2011-08-22 | NULL |
+------------+-------+


结果如下:


+------------+-------+-------+-------+-------+-------+
| a | b1 | b2 | b3 | b4 | b5 |
+------------+-------+-------+-------+-------+-------+
| 2011-08-22 | tag1 | tag2 |tag3 |tag30 | tag40 |
+------------+-------+-------+-------+-------+-------+


我的思路:

1、把行的转换成列:


+------------+-------+-------+-------+----|
| a | b1 |
+------------+-------+-------+-------+----|
| 2011-08-22 | tag1,tag2,tag3,tag30,tag40 |
+------------+-------+-------+-------+----|


2、再b1字段拆开来,拆成多个字段

解决方法:


root@xxx 08:24:46>select a,group_concat(b) from test where b is not null;
+------------+----------------------------+
| a | group_concat(b) |
+------------+----------------------------+
| 2011-08-22 | tag1,tag2,tag3,tag30,tag40 |
+------------+----------------------------+


分割函数([url]http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/[/url]):


root@xxx 08:25:58>CREATE FUNCTION SPLIT_STR(
-> x VARCHAR(255),
-> delim VARCHAR(12),
-> pos INT
-> )
-> RETURNS VARCHAR(255)
-> RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
-> LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
-> delim, '');
Query OK, 0 rows affected (0.00 sec)

root@xxx 08:28:11>select a,
-> split_str(group_concat(b), ',', 1) b1,
-> split_str(group_concat(b), ',', 2) b2,
-> split_str(group_concat(b), ',', 3) b3,
-> split_str(group_concat(b), ',', 4) b4,
-> split_str(group_concat(b), ',', 5) b5
-> from test
-> where b is not null;
+------------+------+------+------+-------+-------+
| a | b1 | b2 | b3 | b4 | b5 |
+------------+------+------+------+-------+-------+
| 2011-08-22 | tag1 | tag2 | tag3 | tag30 | tag40 |
+------------+------+------+------+-------+-------+
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值