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 28 MySQL
如何用Navicat操作MySQL
May 12 MySQL
mysql 8.0.24 安装配置方法图文教程
May 12 MySQL
MySQL数据库压缩版本安装与配置详细教程
May 21 MySQL
Mysql基础知识点汇总
May 26 MySQL
Mysql数据库命令大全
May 26 MySQL
MySQL REVOKE实现删除用户权限
Jun 18 MySQL
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
Jun 26 MySQL
SpringBoot连接MySQL获取数据写后端接口的操作方法
Nov 02 MySQL
MySQL之MyISAM存储引擎的非聚簇索引详解
Mar 03 MySQL
mysql 获取相邻数据项
May 11 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
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 截取字符串专题集合
2010/08/19 PHP
PHP set_error_handler()函数使用详解(示例)
2013/11/12 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
使用composer命令加载vendor中的第三方类库 的方法
2019/07/09 PHP
jQuery的12招常用技巧分享
2011/08/08 Javascript
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
在jquery boxy中添加百度地图坐标拾取注意流程
2014/04/03 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
javascript框架设计读书笔记之种子模块
2014/12/02 Javascript
jquery实现动态画圆
2014/12/04 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
JS实现Fisheye效果动感放大菜单代码
2015/10/21 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
vue分页组件table-pagebar使用实例解析
2020/11/15 Javascript
jquery ui sortable拖拽后保存位置
2017/04/27 jQuery
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
微信小程序三级联动地址选择器的实例代码
2017/07/12 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
2018/09/29 Javascript
详解webpack打包第三方类库的正确姿势
2018/10/20 Javascript
JavaScript中BOM对象原理与用法分析
2019/07/09 Javascript
vue路由传参的基本实现方式小结【三种方式】
2020/02/05 Javascript
[33:19]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第一场 11.26
2020/11/30 DOTA
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
Python使用sorted排序的方法小结
2017/07/28 Python
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
python爬虫之模拟登陆csdn的实例代码
2018/05/18 Python
使用python创建Excel工作簿及工作表过程图解
2020/05/27 Python
基于python实现破解滑动验证码过程解析
2020/05/28 Python
基于python实现模拟数据结构模型
2020/06/12 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
2016年“9.22”世界无车日活动小结
2016/04/05 职场文书
python3 实现mysql数据库连接池的示例代码
2021/04/17 Python
用Python生成会跳舞的美女
2022/01/18 Python
Win11 22H2 2022怎么更新? 获得Win1122H22022版本升级技巧
2022/09/23 数码科技