MySQL - 学习笔记 - 一行转多行
Posted 笑虾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL - 学习笔记 - 一行转多行相关的知识,希望对你有一定的参考价值。
mysql - 学习笔记 - 一行转多行
应用场景
老系统
- 接手一个老系统,没有单独的图片表。
- 所有上传的图片直接将路径存在了业务表中。
- 多张图片路径以
;
分隔。
新需求
- 将所有业务表中的图片路径
files
保存到图片表t_images
的url
中。 - 业务表中原路径
files
改为t_images
中的主键。
工欲善其事必先利其器
1. SUBSTRING_INDEX(str, delim, count)
Returns the substring from string str before count occurrences of the delimiter delim. If count is positive, everything to the left of the final delimiter (counting from the left) is returned. If count is negative, everything to the right of the final delimiter (counting from the right) is returned. SUBSTRING_INDEX() performs a case-sensitive match when searching for delim.
.
从字符串 str 中返回分隔符 delim 出现 count 次之前的子串。 如果 count 为正,则返回最后分隔符左边的所有内容(从左边开始计数)。 如果 count 为负数,则返回最后分隔符右边的所有内容(从右边开始计数)。 SUBSTRING_INDEX() 在搜索 delim 时执行区分大小写的匹配。
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
-> 'www.mysql'
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
-> 'mysql.com'
通过嵌套取中间的mysql
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('www.mysql.com', '.', 2), '.', -1);
-> 'mysql'
2. 内连接:INNER JOIN 简写 JOIN
TOY
表,CAT
表,两表中满足条件的每一行交叉组合:
3. 辅助表
mysql.help_topic
只是借用了一下它的help_topic_id
字段。 0
到 636
(其实只要比每条记录中的图片数量大即可)
实现
SELECT
a.id AS `ref_id`, -- 关联的业务id (32位UUID)
substring_index( substring_index( a.files, ';', b.help_topic_id + 1 ), ';',- 1 ) AS `url`
FROM
`业务表` a
JOIN mysql.help_topic b ON b.help_topic_id < ( length( a.files ) - length( REPLACE ( a.files, ';', '' ) ) + 1 )
表连接
: 表a
中的每一行连接
表b
中help_topic_id
小于图片张数的行。(help_topic_id 从0开始,所以这里+1)。
这便实现了files
有几个分隔符,结果就得到几行。url字段
:借助本行的b.help_topic_id
截取出对应的文件路径。
参考资料
CSDN-五个小土豆:mysql将一行转多行的方法
博客园-励志当个厨师:MySQL的JOIN(一):用法
以上是关于MySQL - 学习笔记 - 一行转多行的主要内容,如果未能解决你的问题,请参考以下文章