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 相关文章推荐
数据库连接池
Apr 06 MySQL
Idea连接MySQL数据库出现中文乱码的问题
Apr 14 MySQL
MySQL 数据类型选择原则
May 27 MySQL
MySQL Router实现MySQL的读写分离的方法
May 27 MySQL
MySQL 数据恢复的多种方法汇总
Jun 21 MySQL
MySQL8.0.18配置多主一从
Jun 21 MySQL
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
Aug 02 MySQL
一次MySQL启动导致的事故实战记录
Sep 15 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
Mysql分析设计表主键为何不用uuid
Mar 31 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
Apr 03 MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
May 30 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通过正则表达式下载图片到本地的实现代码
2011/09/19 PHP
phpQuery让php处理html代码像jQuery一样方便
2015/01/06 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
试用php中oci8扩展
2015/06/18 PHP
为JavaScript添加重载函数的辅助方法
2010/07/04 Javascript
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
Jquery动态进行图片缩略的原理及实现
2013/08/13 Javascript
javascript动画算法实例分析
2015/07/31 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
JavaScipt选取文档元素的方法(推荐)
2016/08/05 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
2017/09/20 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
vue router+vuex实现首页登录验证判断逻辑
2018/05/17 Javascript
js中!和!!的区别与用法
2020/05/09 Javascript
[02:37]2015国际邀请赛选手档案—LGD.Xiao8
2015/07/28 DOTA
[56:42]完美世界DOTA2联赛循环赛 Matador vs Forest 第二场 11.06
2020/11/06 DOTA
Python学习入门之区块链详解
2017/07/25 Python
tensorflow 打印内存中的变量方法
2018/07/30 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
深入学习python多线程与GIL
2019/08/26 Python
Python实现代码统计工具
2019/09/19 Python
Html5游戏开发之乒乓Ping Pong游戏示例(二)
2013/01/21 HTML / CSS
html5将图片转换成base64的实例代码
2016/09/21 HTML / CSS
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
园林设计师自荐信
2013/11/18 职场文书
自主招生自荐信
2013/12/08 职场文书
幼儿园小班教学反思
2014/02/02 职场文书
活动策划邀请函
2014/02/06 职场文书
大学生求职工作的自我评价
2014/02/13 职场文书
财产公证书样本
2014/04/04 职场文书
公安个人四风问题对照检查及整改措施
2014/10/28 职场文书
九寨沟导游词
2015/02/02 职场文书
小学运动会通讯稿
2015/07/18 职场文书
Pytorch使用shuffle打乱数据的操作
2021/05/20 Python