MySQL把逗号分隔的id转换成逗号分隔的文字

有些列的值是逗号分隔的id,例如用户id:1,2,3,想要把这些id转成对应的文字,本文介绍转换方法。

方法一:

借助mysql.help_topic,参考我的另一篇博客:MySQL列转行-CSDN博客

方法二:

借助SUBSTRING_INDEX,先按逗号拆开,再转换成文字,最后拼接:

sql 复制代码
select w.id workorderId,
		w.desc workorderDesc,
		concat(if(s1.name is null , '' ,s1.name),
			if(s2.name is null or s2.name = s1.name,'',concat(',',s2.name)),
			if(s3.name is null or s3.name = s2.name,'',concat(',',s3.name)),
			if(s4.name is null or s4.name = s3.name,'',concat(',',s4.name)),
			if(s5.name is null or s5.name = s4.name,'',concat(',',s5.name))
		) processors
from workorder w
left join staff s1 on s1.id=SUBSTRING_INDEX(w.processors,',',1)
left join staff s2 on s2.id=SUBSTRING_INDEX(SUBSTRING_INDEX(w.processors,',',2),',',-1)
left join staff s3 on s3.id=SUBSTRING_INDEX(SUBSTRING_INDEX(w.processors,',',3),',',-1)
left join staff s4 on s4.id=SUBSTRING_INDEX(SUBSTRING_INDEX(w.processors,',',4),',',-1)
left join staff s5 on s5.id=SUBSTRING_INDEX(SUBSTRING_INDEX(w.processors,',',5),',',-1)

注意:其中的比较"s2.name = s1.name"等是必须的,因为SUBSTRING_INDEX超出元素个数以后,会一直取最后一个元素,以下给出反例,注意避免

sql 复制代码
select w.id workorderId,
		w.desc workorderDesc,
		concat(if(s1.name is null , '' ,s1.name),
			if(s2.name is null,'',concat(',',s2.name)),
			if(s3.name is null,'',concat(',',s3.name)),
			if(s4.name is null,'',concat(',',s4.name)),
			if(s5.name is null,'',concat(',',s5.name))
		) processors
from workorder w
left join staff s1 on s1.id=SUBSTRING_INDEX(w.processors,',',1)
left join staff s2 on s2.id=SUBSTRING_INDEX(SUBSTRING_INDEX(w.processors,',',2),',',-1)
left join staff s3 on s3.id=SUBSTRING_INDEX(SUBSTRING_INDEX(w.processors,',',3),',',-1)
left join staff s4 on s4.id=SUBSTRING_INDEX(SUBSTRING_INDEX(w.processors,',',4),',',-1)
left join staff s5 on s5.id=SUBSTRING_INDEX(SUBSTRING_INDEX(w.processors,',',5),',',-1)

方法三:

借助substr,适用于id长度固定的情况,如果id不固定,不可以使用。

left(w.processors,<id长度>)

substr(w.processors,<开始截取位置>,<id长度>)

sql 复制代码
select w.id workorderId,
		w.desc workorderDesc,
		concat(if(s1.name is null , '' ,s1.name),
			if(s2.name is null,'',concat(',',s2.name)),
			if(s3.name is null,'',concat(',',s3.name)),
			if(s4.name is null,'',concat(',',s4.name)),
			if(s5.name is null,'',concat(',',s5.name))
		) processors
from workorder w
left join staff s1 on left(w.processors,1) = s1.id
left join staff s2 on substr(w.processors,3,1) = s2.id
left join staff s3 on substr(w.processors,5,1) = s3.id
left join staff s4 on substr(w.processors,7,1) = s4.id
left join staff s5 on substr(w.processors,9,1) = s5.id
相关推荐
橘猫云计算机设计1 小时前
springboot基于hadoop的酷狗音乐爬虫大数据分析可视化系统(源码+lw+部署文档+讲解),源码可白嫖!
数据库·hadoop·spring boot·爬虫·python·数据分析·毕业设计
卓怡学长1 小时前
w304基于HTML5的民谣网站的设计与实现
java·前端·数据库·spring boot·spring·html5
冰^2 小时前
MySQL VS SQL Server:优缺点全解析
数据库·数据仓库·redis·sql·mysql·json·数据库开发
电商数据girl2 小时前
产品经理对于电商接口的梳理||电商接口文档梳理与接入
大数据·数据库·python·自动化·产品经理
Spring小子3 小时前
黑马点评商户查询缓存--缓存更新策略
java·数据库·redis·后端
溜溜刘@♞4 小时前
数据库之mysql优化
数据库·mysql
BXCQ_xuan5 小时前
基于Node.js的健身会员管理系统的后端开发实践
后端·mysql·node.js
uwvwko5 小时前
ctfhow——web入门214~218(时间盲注开始)
前端·数据库·mysql·ctf
柯3495 小时前
Redis的过期删除策略和内存淘汰策略
数据库·redis·lfu·lru
Tiger_shl5 小时前
【Python语言基础】24、并发编程
java·数据库·python