mysql列转行方法超详细讲解
发布日期:2025-01-04 11:14 点击次数:135
一、列转行
mysql 数据库中,我们可能遇到将数据库中某一列的数据(多个值,按照英文逗号分隔),转化为多行数据(即一行转多行),然后join关联表,再转化为一行数据
如:有两张表,一用户表,一张学科表,需要查询学科表中的用户姓名
用户表
idusernameage1zhangsan202lisi213wamhwu22
学科表
iduser_idssubject11,2,3数学22,3语文31,2英语
我们首先需要把学科表中的user_ids拆分成多行
iduser_idsubject11数学12数学13数学22语文23语文31英语32英语
二、普通的实现方式(需要依赖 mysql.help_topic 表)
三、mysql.help_topic 无权限处理办法
mysql.help_topic 的作用是对 SUBSTRING_INDEX 函数出来的数据(也就是按照分割符分割出来的)数据连接起来做笛卡尔积。
如果 mysql.help_topic 没有权限,可以自己创建一张临时表,用来与要查询的表连接查询。
获取该字段最多可以分割成为几个字符串:
创建临时表,并给临时表添加数据:
注意:
临时表必须有一列从 0 或者 1 开始的自增数据临时表表名随意,字段可以只有一个临时表示的数据量必须比 MAX(LENGTH(a.user_ids) - LENGTH(REPLACE(a.user_ids, ',', '' )) + 1) 的值大
四、查询函数
五、join用户表,关联用户名
iduser_idsubjectusername11数学zhangsan12数学lisi13数学wangwu22语文lisi23语文wangwu31英语zhangsan32英语lisi
六、将多行数据转化为一行
idsubjectuser_idsusername1数学1,2,3zhangsan,lisi,wangwu2语文2,3lisi,wangwu3英语1,2zhangsan,lisi
说明:
SUBSTRING_INDEX(SUBSTRING_INDEX(a.user_ids, ',', b.help_topic_id), ',',-1 ) 就是获取 tmp_help_topic 表的 help_topic_id 字段的值作为 name 字段的第几个子串使用了 join 就会把字段 user_ids 分为 (LENGTH( a.user_ids) - LENGTH(REPLACE(a.user_ids, ',', '')) + 1 ) 行,并且每行的字段刚好是 user_ids字段的第 help_topic_id 个子串
GROUP_CONCAT函数用于将GROUP BY产生的同一个分组中的值连接起来,返回一个字符串结果
GROUP_CONCAT函数首先根据GROUP BY指定的列进行分组,将同一组的列显示出来,并且用分隔符分隔,由函数参数(字段名)决定要返回的列
语法结构
说明:
(1) 使用DISTINCT可以排除重复值
(2) 如果需要对结果中的值进行排序,可以使用ORDER BY子句
(3) SEPARATOR '分隔符'是一个字符串值,默认为逗号
总结
到此这篇关于mysql列转行方法的文章就介绍到这了,更多相关mysql列转行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!