mysql列转行
时间: 2023-06-28 20:12:04 浏览: 114
在 MySQL 中,可以使用 GROUP_CONCAT 函数将多行数据合并为一行,然后再使用 SUBSTRING_INDEX 函数拆分为多列。这样就可以实现列转行的效果。
示例代码如下:
假设有如下表结构和数据:
```
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`value` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `test` (`name`, `value`) VALUES ('a', '1,2,3');
INSERT INTO `test` (`name`, `value`) VALUES ('b', '4,5,6');
INSERT INTO `test` (`name`, `value`) VALUES ('c', '7,8,9');
```
要将 value 列转成多行,可以使用以下 SQL 语句:
```
SELECT
id,
name,
SUBSTRING_INDEX(SUBSTRING_INDEX(value, ',', n), ',', -1) AS value
FROM
test
INNER JOIN (
SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3
) numbers ON CHAR_LENGTH(value) - CHAR_LENGTH(REPLACE(value, ',', '')) >= n - 1
ORDER BY
id,
n;
```
这里的关键是 numbers 表,它包含了一个从 1 到 3 的数字序列。这个表会与 test 表进行内连接,产生三倍于 test 表的行数。然后使用 SUBSTRING_INDEX 函数将 value 列拆分成多个部分,并按照 n 的值进行排序。最后得到的结果就是列转行后的数据。
注意,这种方法有一个缺点,就是无法处理变长的 value 列。如果 value 列中包含的元素个数不确定,那么这种方法就无法使用了。
阅读全文