文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

mysql 列转行

2023-08-31 19:43

关注

一、列转行

mysql 数据库中,我们可能遇到将数据库中某一列的数据(多个值,按照英文逗号分隔),转化为多行数据(即一行转多行),然后join关联表,再转化为一行数据

如:有两张表,一用户表,一张学科表,需要查询学科表中的用户姓名

用户表
idusernameage
1zhangsan20
2lisi21
3wamhwu22
学科表
iduser_idssubject
11,2,3数学
22,3语文
31,2英语

我们首先需要把学科表中的user_ids拆分成多行

iduser_idsubject
11数学
12数学
13数学
22语文
23语文
31英语
32英语

二、普通的实现方式(需要依赖 mysql.help_topic 表)

SELECT    a.id,    a.subject,    SUBSTRING_INDEX( SUBSTRING_INDEX( a.`user_ids`, ',', b.help_topic_id + 1 ), ',',-1 ) user_idFROM    test a    JOIN mysql.help_topic b ON b.help_topic_id < ( LENGTH( a.`user_ids`) - LENGTH( REPLACE ( a.`user_ids`, ',', '' ) ) + 1 );

三、mysql.help_topic 无权限处理办法

mysql.help_topic 的作用是对 SUBSTRING_INDEX 函数出来的数据(也就是按照分割符分割出来的)数据连接起来做笛卡尔积。

如果 mysql.help_topic 没有权限,可以自己创建一张临时表,用来与要查询的表连接查询。

获取该字段最多可以分割成为几个字符串:
 

SELECT MAX(LENGTH(a.`user_ids`) - LENGTH(REPLACE(a.`user_ids`, ',', '' )) + 1) FROM `test` a;

创建临时表,并给临时表添加数据:

注意:

  1. 临时表必须有一列从 0 或者 1 开始的自增数据
  2. 临时表表名随意,字段可以只有一个
  3. 临时表示的数据量必须比 MAX(LENGTH(a.user_ids) - LENGTH(REPLACE(a.user_ids, ',', '' )) + 1) 的值大
DROP TABLE IF EXISTS `tmp_help_topic`;CREATE TABLE IF NOT EXISTS `tmp_help_topic` (  `help_topic_id` bigint(20) NOT NULL AUTO_INCREMENT ,  PRIMARY KEY (`help_topic_id`));INSERT INTO `tmp_help_topic`() VALUES ();INSERT INTO `tmp_help_topic`() VALUES ();INSERT INTO `tmp_help_topic`() VALUES ();INSERT INTO `tmp_help_topic`() VALUES ();INSERT INTO `tmp_help_topic`() VALUES ();INSERT INTO `tmp_help_topic`() VALUES ();INSERT INTO `tmp_help_topic`() VALUES ();INSERT INTO `tmp_help_topic`() VALUES ();INSERT INTO `tmp_help_topic`() VALUES ();INSERT INTO `tmp_help_topic`() VALUES ();

四、查询函数

SELECT    a.id,a.subject,SUBSTRING_INDEX(SUBSTRING_INDEX(a.`user_ids`, ',', b.help_topic_id), ',',-1 ) user_idFROM    test a    JOIN tmp_help_topic b ON b.help_topic_id <= (LENGTH( a.`user_ids`) - LENGTH(REPLACE(a.`user_ids`, ',', '')) + 1 );

五、join用户表,关联用户名

select t2.*,u.usernamefrom (   SELECT    a.id,a.subject,SUBSTRING_INDEX(SUBSTRING_INDEX(a.`user_ids`, ',', b.help_topic_id), ',',-1 ) user_idFROM    test a    JOIN tmp_help_topic b ON b.help_topic_id <= (LENGTH( a.`user_ids`) - LENGTH(REPLACE(a.`user_ids`, ',', '')) + 1 ) ) t2 join user u on u.id = t2.user_id
iduser_idsubjectusername
11数学zhangsan
12数学lisi
13数学wangwu
22语文lisi
23语文wangwu
31英语zhangsan
32英语lisi

六、将多行数据转化为一行

select t2.*,group_concat(u.username) usernamefrom (   SELECT    a.id,a.subject,SUBSTRING_INDEX(SUBSTRING_INDEX(a.`user_ids`, ',', b.help_topic_id), ',',-1 ) user_idFROM    test a    JOIN tmp_help_topic b ON b.help_topic_id <= (LENGTH( a.`user_ids`) - LENGTH(REPLACE(a.`user_ids`, ',', '')) + 1 ) ) t2 join user u on u.id = t2.user_idgroup by t2.id
idsubjectuser_idsusername
1数学1,2,3zhangsan,lisi,wangwu
2语文2,3lisi,wangwu
3英语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指定的列进行分组,将同一组的列显示出来,并且用分隔符分隔,由函数参数(字段名)决定要返回的列

语法结构

GROUP_CONCAT([DISTINCT] 要连接的字段 [ORDER BY 排序字段 ASC/DESC] [SEPARATOR '分隔符'])

说明:

(1) 使用DISTINCT可以排除重复值

(2) 如果需要对结果中的值进行排序,可以使用ORDER BY子句

(3) SEPARATOR '分隔符'是一个字符串值,默认为逗号

来源地址:https://blog.csdn.net/bankq/article/details/130677479

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯