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 使用事件(Events)完成计划任务
May 24 MySQL
MySQL 亿级数据导入导出及迁移笔记
Jun 18 MySQL
MySQL系列之开篇 MySQL关系型数据库基础概念
Jul 02 MySQL
Mysql中where与on的区别及何时使用详析
Aug 04 MySQL
MySQL七种JOIN类型小结
Oct 24 MySQL
MySQL分区表实现按月份归类
Nov 01 MySQL
MySQL中varchar和char类型的区别
Nov 17 MySQL
MySQL利用UNION连接2个查询排序失效详解
Nov 20 MySQL
优化Mysql查询的示例
Apr 26 MySQL
MySQL详细讲解变量variables的用法
Jun 21 MySQL
MySQL约束(创建表时的各种条件说明)
Jun 21 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 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中看实例学正则表达式
2006/12/25 PHP
php 文章采集正则代码
2009/12/28 PHP
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
2010/06/09 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
2011/11/07 PHP
调整PHP的性能
2013/10/30 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
jquery延迟加载外部js实现代码
2013/01/11 Javascript
jquery鼠标停止移动事件
2013/12/21 Javascript
js正则表达式中test,exec,match方法的区别说明
2014/01/29 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
vue实现输入框自动跳转功能
2020/05/20 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
小程序实现密码输入框
2020/11/16 Javascript
[44:37]完美世界DOTA2联赛PWL S3 Forest vs access 第一场 12.11
2020/12/13 DOTA
python模拟鼠标拖动操作的方法
2015/03/11 Python
python轻松实现代码编码格式转换
2015/03/26 Python
Python 专题二 条件语句和循环语句的基础知识
2017/03/19 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
Linux下升级安装python3.8并配置pip及yum的教程
2020/01/02 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
2020/04/21 Python
python logging.info在终端没输出的解决
2020/05/12 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
创建无烟单位实施方案
2014/03/29 职场文书
艺术教育实施方案
2014/05/03 职场文书
社会实践先进工作者事迹材料
2014/05/06 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
买房子个人收入证明
2014/10/12 职场文书
国际贸易实训报告
2014/11/05 职场文书
2019新员工试用期转正工作总结范文
2019/08/21 职场文书
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python