Mysql table data row and column conversion method

jacklove
Release: 2023-04-01 12:24:02
Original
2939 people have browsed it

During the development process, due to historical reasons or performance reasons, it is necessary to convert the column data of the table into row data, or convert the row data into column data. This article will introduce the method of converting rows and rows of mysql table data, and provide complete demonstration examples and sql skills.

1. Convert rows to columns

Create test data table and data

CREATE TABLE `option` ( `category_id` int(10) unsigned NOT NULL COMMENT '分类id', `name` varchar(20) NOT NULL COMMENT '名称', KEY `category_id` (`category_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `option` (`category_id`, `name`) VALUES
(1, '大'),
(1, '中'),
(1, '小'),
(2, '奔驰'),
(2, '宝马'),
(3, '2015'),
(3, '2016'),
(3, '2017'),
(3, '2018'),
(4, '1m'),
(4, '2m');mysql> select * from `option`;
+-------------+--------+| category_id | name   |
+-------------+--------+|           1 | 大     |
|           1 | 中     |
|           1 | 小     |
|           2 | 奔驰   |
|           2 | 宝马   |
|           3 | 2015   |
|           3 | 2016   |
|           3 | 2017   |
|           3 | 2018   |
|           4 | 1m     ||           4 | 2m     |
+-------------+--------+
Copy after login

After converting rows to columns, expect the following Result

+-------------+---------------------+| category_id | name                |
+-------------+---------------------+|           1 | 大,中,小            |
|           2 | 奔驰,宝马           |
|           3 | 2015,2016,2017,2018 ||           4 | 1m,2m               |
+-------------+---------------------+
Copy after login


Row to column conversion can be achieved by using the group_concat() function combined with group by.

The group_concat() function can get the connection value of the expression combination. The default separator is comma, which can be set to other separators through separator.

Note: The group_concat() function has a length limit on the returned result. The default is 1024 bytes, but it is enough for normal situations.

Regarding the use of the group_concat() function, please refer to my previous article: "Instructions for the use of mysql function concat and group_concat"

Execution results:

mysql> select category_id,group_concat(name) as name from `option` group by category_id order by category_id;
+-------------+---------------------+| category_id | name                |
+-------------+---------------------+|           1 | 大,中,小            |
|           2 | 奔驰,宝马           |
|           3 | 2015,2016,2017,2018 ||           4 | 1m,2m               |
+-------------+---------------------+
Copy after login

2. Column to row


Create test data table and data

CREATE TABLE `option2` ( `category_id` int(10) unsigned NOT NULL COMMENT '分类id', `name` varchar(100) NOT NULL COMMENT '名称集合') ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `option2` (`category_id`, `name`) VALUES
(1, '大,中,小 '),
(2, '奔驰,宝马'),
(3, '2015,2016,2017,2018'),
(4, '1m,2m');mysql> select * from `option2`;
+-------------+---------------------+| category_id | name                |
+-------------+---------------------+|           1 | 大,中,小            |
|           2 | 奔驰,宝马           |
|           3 | 2015,2016,2017,2018 ||           4 | 1m,2m               |
+-------------+---------------------+
Copy after login

After converting columns to rows, expect the following results

+-------------+--------+| category_id | name   |
+-------------+--------+|           1 | 大     |
|           1 | 中     |
|           1 | 小     |
|           2 | 奔驰   |
|           2 | 宝马   |
|           3 | 2015   |
|           3 | 2016   |
|           3 | 2017   |
|           3 | 2018   |
|           4 | 1m     ||           4 | 2m     |
+-------------+--------+
Copy after login


Column conversion is more complicated than row conversion. For data whose column content is separated by delimiters, we can use substring_index() The function divides the output and combines Cartesian product to implement the loop.

select a.category_id,substring_index(substring_index(a.name,&#39;,&#39;,b.category_id),&#39;,&#39;,-1) as name from `option2` as ajoin `option2` as b on b.category_id<=(length(a.name) - length(replace(a.name,&#39;,&#39;,&#39;&#39;))+1)order by a.category_id,b.category_id;
Copy after login


Execution result:

mysql> select a.category_id,substring_index(substring_index(a.name,&#39;,&#39;,b.category_id),&#39;,&#39;,-1) as name from `option2` as a    -> join `option2` as b on b.category_id<=(length(a.name) - length(replace(a.name,&#39;,&#39;,&#39;&#39;))+1)    -> order by a.category_id,b.category_id;
+-------------+--------+| category_id | name   |
+-------------+--------+|           1 | 大     |
|           1 | 中     |
|           1 | 小     |
|           2 | 奔驰   |
|           2 | 宝马   |
|           3 | 2015   |
|           3 | 2016   |
|           3 | 2017   |
|           3 | 2018   |
|           4 | 1m     ||           4 | 2m     |
+-------------+--------+
Copy after login

This article explains the method of converting rows and columns of mysql table data. For more related content, please pay attention to php Chinese net.

Related recommendations:

nginx method to quickly view configuration files

php Multiple one-dimensional numbers are combined into two Methods for dimensional arrays

php Methods for returning specified multiple columns in an array

The above is the detailed content of Mysql table data row and column conversion method. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template