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基础之常见函数
Apr 22 MySQL
MySQL Router的安装部署
Apr 24 MySQL
MySQL 数据丢失排查案例
May 08 MySQL
MySQL去除重叠时间求时间差和的实现
Aug 23 MySQL
MySQL分库分表详情
Sep 25 MySQL
MYSQL如何查看进程和kill进程
Mar 13 MySQL
MySQL读取JSON转换的方式
Mar 18 MySQL
navicat 连接Ubuntu虚拟机的mysql的操作方法
Apr 02 MySQL
详解Mysq MVCC多版本的并发控制
Apr 29 MySQL
MySQL 数据表操作
May 04 MySQL
MySql数据库触发器使用教程
Jun 01 MySQL
分享很少见很有用的SQL功能CORRESPONDING
Aug 05 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网页后退不再出现过期
2007/03/08 PHP
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
使用PHP访问RabbitMQ消息队列的方法示例
2018/06/06 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
2018/06/11 PHP
基于jQuery的弹出框插件
2012/03/18 Javascript
在javascript中实现函数数组的方法
2013/12/25 Javascript
解析Node.js基于模块和包的代码部署方式
2016/02/16 Javascript
JavaScript直播评论发弹幕切图功能点集合效果代码
2016/06/26 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
vue 中Virtual Dom被创建的方法
2019/04/15 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
Python中的闭包实例详解
2014/08/29 Python
python相似模块用例
2016/03/04 Python
Python中的连接符(+、+=)示例详解
2017/01/13 Python
Python实现查找匹配项作处理后再替换回去的方法
2017/06/10 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
Django-celery-beat动态添加周期性任务实现过程解析
2020/11/26 Python
python二维图制作的实例代码
2020/12/03 Python
css3进阶之less实现星空动画的示例代码
2019/09/10 HTML / CSS
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
《草虫的村落》教学反思
2014/02/16 职场文书
会计助理岗位职责
2014/02/17 职场文书
大学同学十年聚会感言
2014/02/21 职场文书
客服部班长工作责任制
2014/02/25 职场文书
暖通工程师岗位职责
2014/06/12 职场文书
小学教师自我剖析材料
2014/09/29 职场文书
2014年物业公司工作总结
2014/11/22 职场文书
个人先进材料范文
2014/12/30 职场文书
小学生思想品德评语
2014/12/31 职场文书
Win11查看设备管理器
2022/04/19 数码科技
python基础之//、/与%的区别详解
2022/06/10 Python