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 InnoDB存储引擎的内存管理
Apr 08 MySQL
mysql数据库入门第一步之创建表
May 14 MySQL
IDEA 链接Mysql数据库并执行查询操作的完整代码
May 20 MySQL
正确使用MySQL INSERT INTO语句
May 26 MySQL
Mysql中调试存储过程最简单的方法
Jun 30 MySQL
MySQL连接控制插件介绍
Sep 25 MySQL
浅谈MySQL表空间回收的正确姿势
Oct 05 MySQL
MySQL中B树索引和B+树索引的区别详解
Mar 03 MySQL
详细聊一聊mysql的树形结构存储以及查询
Apr 05 MySQL
MySQL数据库安装方法与图形化管理工具介绍
May 30 MySQL
MySQL中order by的执行过程
Jun 05 MySQL
MySQL远程无法连接的一些常见原因总结
Sep 23 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 jsonp单引号转义
2014/11/23 PHP
Yii实现MySQL多数据库和读写分离实例分析
2014/12/03 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
2017/03/15 PHP
javascript事件模型代码
2007/07/01 Javascript
获取焦点时,利用js定时器设定时间执行动作
2010/04/02 Javascript
基于jquery的loading 加载提示效果实现代码
2011/09/01 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
document.all的一个比较完整的总结及案例
2013/01/31 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
2015/10/22 Javascript
JavaScript程序开发之JS代码放置的位置
2016/01/15 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
2016/06/23 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
javaScript语法总结
2016/11/25 Javascript
详解基于webpack搭建react运行环境
2017/06/01 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
vue-cli3中vue.config.js配置教程详解
2019/05/29 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
Python动刷新抢12306火车票的代码(附源码)
2018/01/24 Python
python MNIST手写识别数据调用API的方法
2018/08/08 Python
Python读取mat文件,并保存为pickle格式的方法
2018/10/23 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
澳洲网红粉泥面膜:Sand & Sky
2019/08/13 全球购物
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
医院实习介绍信
2014/01/12 职场文书
会计学生自我鉴定
2014/02/06 职场文书
2014年六一儿童节演讲稿
2014/05/23 职场文书
学习焦裕禄同志为人民服务思想汇报
2014/09/10 职场文书
房屋买卖委托书格式范本格式
2014/10/13 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
民间借贷纠纷案件代理词
2015/05/26 职场文书
四大名著读书笔记
2015/06/25 职场文书
公司员工培训管理制度
2015/08/04 职场文书
Vue如何实现组件间通信
2021/05/15 Vue.js