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 使用SQL语句修改表名的实现
Apr 07 MySQL
浅谈Mysql多表连接查询的执行细节
Apr 24 MySQL
MySQL 角色(role)功能介绍
Apr 24 MySQL
jdbc使用PreparedStatement批量插入数据的方法
Apr 27 MySQL
详解MySQL主从复制及读写分离
May 07 MySQL
Mysql systemctl start mysqld报错的问题解决
Jun 03 MySQL
MySQL的安装与配置详细教程
Jun 26 MySQL
MySQL高速缓存启动方法及参数详解(query_cache_size)
Jul 01 MySQL
MySQL的全局锁和表级锁的具体使用
Aug 23 MySQL
浅谈MySQL函数
Oct 05 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
浅谈如何保证Mysql主从一致
Mar 13 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
JAVA/JSP学习系列之六
2006/10/09 PHP
文件上传类
2006/10/09 PHP
MySQL数据源表结构图示
2008/06/05 PHP
php 上传文件类型判断函数(避免上传漏洞 )
2010/06/08 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
2016/11/22 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
php实现的redis缓存类定义与使用方法示例
2017/08/09 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
jQuery使用数组编写图片无缝向左滚动
2012/12/11 Javascript
JSON传递bool类型数据的处理方式介绍
2013/09/18 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
2014/04/02 Javascript
技术男用来对妹子表白的百度首页
2014/07/23 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
vue2.0实现分页组件的实例代码
2017/06/22 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
bootstrap-table formatter 使用vue组件的方法
2019/05/09 Javascript
Angular.JS读取数据库数据调用完整实例
2019/07/02 Javascript
Vue实现数据表格合并列rowspan效果
2020/11/30 Javascript
vue自动添加浏览器兼容前后缀操作
2020/08/13 Javascript
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
[48:05]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VGJ.T vs VP
2018/03/31 DOTA
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
使用python编写简单的小程序编译成exe跑在win10上
2018/01/15 Python
python中PS 图像调整算法原理之亮度调整
2019/06/28 Python
基于TensorFlow常量、序列以及随机值生成实例
2020/01/04 Python
大学生个人自我鉴定
2013/12/03 职场文书
世博会口号
2014/06/20 职场文书
《蓝鲸的眼睛》读后感5篇
2020/01/15 职场文书
一文读懂navicat for mysql基础知识
2021/05/31 MySQL