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对于模糊查询like的一些汇总
May 09 MySQL
分析MySQL抛出异常的几种常见解决方式
May 18 MySQL
安装配置mysql及Navicat prenium的详细流程
Jun 10 MySQL
MySQL如何使用使用Xtrabackup进行备份和恢复
Jun 21 MySQL
详解MySQL多版本并发控制机制(MVCC)源码
Jun 23 MySQL
记一次Mysql不走日期字段索引的原因小结
Oct 24 MySQL
MySQL 服务和数据库管理
Nov 11 MySQL
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
Jan 22 MySQL
关于k8s环境部署mysql主从的问题
Mar 13 MySQL
MySQL时区造成时差问题
Apr 13 MySQL
Mysql 文件配置解析介绍
May 06 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防止表单重复提交的几种常用方法汇总
2014/08/19 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
2015/07/15 PHP
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
2016/05/28 Javascript
js实现千分符和保留几位小数的简单实例
2016/08/01 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
Angularjs 依赖压缩及自定义过滤器写法
2017/02/04 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
在vue中使用image-webpack-loader实例
2020/11/12 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
[01:57]DOTA2上海特锦赛小组赛解说单车采访花絮
2016/02/27 DOTA
[01:03:31]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第二局
2016/02/26 DOTA
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
python的多重继承的理解
2017/08/06 Python
python发送邮件脚本
2018/05/22 Python
BP神经网络原理及Python实现代码
2018/12/18 Python
ActiveMQ:使用Python访问ActiveMQ的方法
2019/01/30 Python
Django中信号signals的简单使用方法
2019/07/04 Python
python tkinter实现连连看游戏
2020/11/16 Python
python中os.remove()用法及注意事项
2021/01/31 Python
Pycharm 设置默认解释器路径和编码格式的操作
2021/02/05 Python
详解使用HTML5的classList属性操作CSS类
2017/10/13 HTML / CSS
DJI美国:消费类无人机领域的领导者
2018/04/27 全球购物
Piercing Pagoda官网:耳环、戒指、项链、手链等
2020/09/28 全球购物
用Python写一个for循环的例子
2016/07/19 面试题
物资采购方案
2014/06/12 职场文书
幼儿园教师师德师风演讲稿:爱我所爱 无悔青春
2014/09/10 职场文书
乡镇团委工作总结2015
2015/05/26 职场文书
医院感染管理制度
2015/08/05 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
MySQL 分页查询的优化技巧
2021/05/12 MySQL