Mysql将字符串按照指定字符分割的正确方法


Posted in MySQL onMay 30, 2022

前言

在某些场景下(比如:用户上传文件或者图片等),一般的做法是将文件信息(文件名,文件路径,文件大小等)保存到文件表(user_file)中,然后再将用户所有上传的文件的id用一个指定字符拼接然后存在表(user)中某个字段里(假设是:file_ids)。
在展示用户上传的文件时就直接查询文件表中就好了:

-- 一般的语句是这样的,假设用户唯一键是id
select * from file where id in(select file_ids from user where id = 1);

sql语句没有问题,文件也能查询出来,但是,上传的文件大于1个后,再用这个sql语句查询就只返回1条记录了,可能就会疑惑了,为什么只返回一条记录???;

肯定有人做过这样的验证

-- 先运行下面这个sql,正确返回1,2,3 假设上传的文件id是1,2,3;
select file_ids from user where id = 1
-- 然后返回的文件id写死在sql语句中,运行成功返回3条记录
select file_ids from user where id in ('1' , '2' , '3');
-- 最后再整体试了下,结果返回一条......
select * from file where id in(select file_ids from user where id = 1)

-- 然后可能会想到:我把in里面的拼接成'1','2','3',这样总可以了吧?
select * from file where id in (select concat('\'', replace(file_ids,',','\',\'') ,'\'') from user where id = 1);
-- concat('\'', replace(file_ids,',','\',\'') ,'\'') 确实能拼接成上面说的形式,但是结果还是只有一条

是因为这个查询只返回一个字段,所以只会返回一条记录(即使有多个逗号拼接,或者是手动拼接的,Mysql只认为是一个值,具体底层不清楚…),正确做法如下:

一:分两次查询(不是本文重点,但可以实现)

select file_ids from user where id = 1

select file_ids from user where id in ('1' , '2' , '3');
或者
select file_ids from user where find_in_set(id , '1,2,3');

二:将file_ids字段分割成多列,类似Mysql的行转列

与Mysql行转列区别:行转列要知道列的内容,而这个不用,只需知道拼接的字符就行了

-- 下面语句将会把1,2,3,4一个字段转换成四行,依次是1,2,3,4
SELECT
	a.id,
	a.file_ids,
	substring_index(
		substring_index(
			a.file_ids,
			',',
			b.help_topic_id + 1
		),
		',' ,- 1
	) file_id
FROM
	user a
JOIN mysql.help_topic b ON b.help_topic_id < (
	length(a.file_ids) - length(REPLACE(a.file_ids, ',', '')) + 1
)
where id = 1
;
-- 然后将上面语句写在in()里面就行了,写在in()里面的话记住只能查询一个字段哦!

上面语句可以直接复制过去,只需将a表及a表字段换成自己的表明及字段就行了,至于mysql.help_topic,是Mysql自带的,不用管的。

附:mysql如何将字符串按分隔符拆分

1.字符串拆分: SUBSTRING_INDEX(pressure 136/70 血压),例如:

SUBSTRING_INDEX(pressure ,',',1)     #截取第一个逗号(,)号以前的字符串
SUBSTRING_INDEX(pressure ,',',-1)    #截取倒数第一个逗号(,)号以后的字符串

2.替换函数:replace( str, from_str, to_str)。例如:

UPDATE bgs_building_copy1 SET `name`=replace(`name`,'=',"");    #替换等号为空字符串

总结

到此这篇关于Mysql将字符串按照指定字符分割的文章就介绍到这了!

MySQL 相关文章推荐
将图片保存到mysql数据库并展示在前端页面的实现代码
May 02 MySQL
MySQL kill不掉线程的原因
May 07 MySQL
MySql开发之自动同步表结构
May 28 MySQL
mysql left join快速转inner join的过程
Jun 30 MySQL
分享MySQL常用 内核 Debug 几种常见方法
Mar 17 MySQL
MySQL派生表联表查询实战过程
Mar 20 MySQL
mysql 获取时间方式
Mar 20 MySQL
MySQL分区表管理命令汇总
Mar 21 MySQL
MySql分区类型及创建分区的方法
Apr 13 MySQL
mysql数据库隔离级别详解
Jun 16 MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
Dec 24 MySQL
MySQL数据库安装方法与图形化管理工具介绍
MySQL数据库简介与基本操作
May 30 #MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
May 30 #MySQL
mysql字段为NULL索引是否会失效实例详解
May 30 #MySQL
MYSQL如何查看操作日志详解
sql查询语句之平均分、最高最低分及排序语句
May 30 #MySQL
mysql5.5中文乱码问题解决的有用方法
You might like
php中几种常见安全设置详解
2010/04/06 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
2016/03/21 PHP
通过event对象的fromElement属性解决热区设置主实体的一个bug
2008/12/22 Javascript
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
2013/04/16 Javascript
jquery ui对话框实例代码
2013/05/10 Javascript
Jquery绑定事件(bind和live的区别介绍)
2013/08/23 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
2015/05/13 Javascript
浅谈js 闭包引起的内存泄露问题
2015/06/22 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
2016/05/18 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
vue项目中使用scss的方法步骤
2019/05/16 Javascript
浅谈Three.js截图并下载的大坑
2019/11/01 Javascript
jQuery实现简单弹幕效果
2019/11/28 jQuery
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
利用Python爬虫给孩子起个好名字
2017/02/14 Python
python利用urllib和urllib2访问http的GET/POST详解
2017/09/27 Python
在Python中输入一个以空格为间隔的数组方法
2018/11/13 Python
python flask安装和命令详解
2019/04/02 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
Python tkinter三种布局实例详解
2020/01/06 Python
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
全球最大的中文旅行网站:去哪儿网
2017/11/16 全球购物
给排水工程师岗位职责
2013/11/21 职场文书
六年级学生评语
2014/04/22 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书
财务人员个人工作总结
2015/02/27 职场文书
2015团员个人年度总结
2015/11/24 职场文书