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的连接查询
Jun 03 MySQL
Mysql数据库值的添加、修改、删除及清空操作实例
Jun 20 MySQL
MySQL中order by的使用详情
Nov 17 MySQL
一文弄懂MySQL中redo log与binlog的区别
Feb 15 MySQL
进阶篇之linux环境下安装MySQL数据库
Apr 09 MySQL
MySQL创建管理HASH分区
Apr 13 MySQL
MySQL创建管理KEY分区
Apr 13 MySQL
Mysql排查分析慢sql之explain实战案例
Apr 19 MySQL
MySQL 字符集 character
May 04 MySQL
MySQL批量更新不同表中的数据
May 11 MySQL
MySQL范围查询优化的场景实例详解
Jun 10 MySQL
MySql如何将查询的出来的字段进行转换
Jun 14 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/07/03 PHP
第三章 php操作符与控制结构代码
2011/12/30 PHP
PHP生成数组再传给js的方法
2014/08/07 PHP
PHP反向代理类代码
2014/08/15 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
2015/05/13 PHP
PHP扩展Swoole实现实时异步任务队列示例
2019/04/13 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
2019/09/16 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
javascript 流畅动画实现原理
2009/09/08 Javascript
JSON 教程 json入门学习笔记
2020/09/22 Javascript
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
2013/04/24 Javascript
jquery中load方法的用法及注意事项说明
2014/02/22 Javascript
jQuery 如何先创建、再修改、后添加DOM元素
2014/05/20 Javascript
jQuery Ztree行政地区树状展示(点击加载)
2016/11/09 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
vue超时计算的组件实例代码
2018/07/09 Javascript
vue数据操作之点击事件实现num加减功能示例
2019/01/19 Javascript
vue获取data数据改变前后的值方法
2019/11/07 Javascript
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
Python深入学习之上下文管理器
2014/08/31 Python
python中web框架的自定义创建
2019/09/08 Python
pymysql的简单封装代码实例
2020/01/08 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
在CentOS7下安装Python3教程解析
2020/07/09 Python
Python selenium实现断言3种方法解析
2020/09/08 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
国际鲜花速递专家:Floraqueen
2016/11/24 全球购物
匡威比利时官网:Converse Belgium
2017/04/13 全球购物
热能动力工程毕业生自荐信
2013/11/07 职场文书
化妆师职业生涯规划书
2014/02/16 职场文书
充分就业社区汇报材料
2014/05/07 职场文书
2015年园林绿化工作总结
2015/05/23 职场文书
歌咏比赛口号大全
2015/12/25 职场文书
2019大学生预备党员转正思想汇报
2019/06/21 职场文书