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 08 MySQL
MySQL中使用or、in与union all在查询命令下的效率对比
May 26 MySQL
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
Jul 01 MySQL
mysql主从复制的实现步骤
Oct 24 MySQL
MySQL中CURRENT_TIMESTAMP的使用方式
Nov 27 MySQL
SQL语法CONSTRAINT约束操作详情
Jan 18 MySQL
MySQL常见优化方案汇总
Jan 18 MySQL
MySQL优化常用的19种有效方法(推荐!)
Mar 17 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
Mysql 如何合理地统计一个数据库里的所有表的数据量
Apr 18 MySQL
MySQL索引 高效获取数据的数据结构
May 02 MySQL
delete in子查询不走索引问题分析
Jul 07 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 Document 代码注释规范
2009/04/13 PHP
php实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
两款万能的php分页类
2015/11/12 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
php与c 实现按行读取文件实例代码
2017/01/03 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
2018/04/20 PHP
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
通过隐藏option实现select的联动效果
2009/11/10 Javascript
jQuery侧边栏随窗口滚动实现方法
2013/03/04 Javascript
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
javascript/jquery获取地址栏url参数的方法
2014/03/05 Javascript
JavaScript Math.ceil 方法(对数值向上取整)
2015/01/09 Javascript
JavaScript学习笔记之基础语法
2015/01/22 Javascript
jquery复选框多选赋值给文本框的方法
2015/01/27 Javascript
jquery实现表单验证简单实例演示
2015/11/23 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
详解Node.js中path模块的resolve()和join()方法的区别
2018/10/29 Javascript
React中使用外部样式的3种方式(小结)
2019/05/28 Javascript
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
vue如何实现自定义底部菜单栏
2019/07/01 Javascript
[47:43]Alliance vs KG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
利用python获得时间的实例说明
2013/03/25 Python
Python 序列的方法总结
2016/10/18 Python
python类的继承实例详解
2017/03/30 Python
django修改models重建数据库的操作
2020/03/31 Python
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
.net面试题
2015/12/22 面试题
广州足迹信息技术有限公司Java软件工程师试题
2014/02/15 面试题
期末自我鉴定
2014/02/02 职场文书
员工安全承诺书
2014/05/22 职场文书
幼儿园保育员责任书
2014/07/22 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
法制工作总结2015
2015/07/23 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书