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 infobright的安装步骤
Apr 07 MySQL
MySQL获取所有分类的前N条记录
May 07 MySQL
如何设计高效合理的MySQL查询语句
May 26 MySQL
详细谈谈MYSQL中的COLLATE是什么
Jun 11 MySQL
mysql 直接拷贝data 目录下文件还原数据的实现
Jul 25 MySQL
mysql 联合索引生效的条件及索引失效的条件
Nov 20 MySQL
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
Dec 06 MySQL
JMeter对MySQL数据库进行压力测试的实现步骤
Jan 22 MySQL
如何创建一个创建MySQL数据库中的datetime类型
Mar 21 MySQL
MySQL去除密码登录告警的方法
Apr 20 MySQL
mysql查看表结构的三种方法总结
Jul 07 MySQL
详解MySQL的内连接和外连接
May 08 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 session应用实例 登录验证
2009/03/16 PHP
PHP人民币金额数字转中文大写的函数代码
2013/02/27 PHP
PHP对象相互引用的内存溢出实例分析
2014/08/28 PHP
php代码架构的八点注意事项
2016/01/25 PHP
Smarty模板引擎缓存机制详解
2016/05/23 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
ThinkPHP5 验证器的具体使用
2018/05/31 PHP
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
2014/12/15 Javascript
JavaScript中的lastIndexOf()方法使用详解
2015/06/06 Javascript
TypeScript 中接口详解
2015/06/19 Javascript
Vuejs第十篇之vuejs父子组件通信
2016/09/06 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
BootStrap 图标icon符号图标glyphicons不正常显示的快速解决办法
2016/12/08 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
详谈表单格式化插件jquery.serializeJSON
2017/06/23 jQuery
深度了解vue.js中hooks的相关知识
2019/06/14 Javascript
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
简单介绍Python中的struct模块
2015/04/28 Python
Python科学计算之NumPy入门教程
2017/01/15 Python
Python 列表理解及使用方法
2017/10/27 Python
利用python将pdf输出为txt的实例讲解
2018/04/23 Python
Python使用pyodbc访问数据库操作方法详解
2018/07/05 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
pandas pivot_table() 按日期分多列数据的方法
2018/11/16 Python
对python 生成拼接xml报文的示例详解
2018/12/28 Python
python 一个figure上显示多个图像的实例
2019/07/08 Python
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
Java中compareTo和compare的区别
2016/04/12 面试题
捐款倡议书范文
2014/02/02 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
2015年七一建党节活动总结
2015/03/20 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
《我是什么》教学反思
2016/02/16 职场文书