MySQL - 学习笔记 - 一行转多行

Posted 笑虾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL - 学习笔记 - 一行转多行相关的知识,希望对你有一定的参考价值。

mysql - 学习笔记 - 一行转多行

应用场景

老系统

  1. 接手一个老系统,没有单独的图片表。
  2. 所有上传的图片直接将路径存在了业务表中。
  3. 多张图片路径以;分隔。

新需求

  1. 将所有业务表中的图片路径files保存到图片表 t_imagesurl 中。
  2. 业务表中原路径 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字段。 0636 (其实只要比每条记录中的图片数量大即可)

实现

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 ) 
  1. 表连接: 表a中的每一行 连接bhelp_topic_id 小于图片张数的行。(help_topic_id 从0开始,所以这里+1)。
    这便实现了files有几个分隔符,结果就得到几行。
  2. url字段:借助本行的b.help_topic_id截取出对应的文件路径。

参考资料

CSDN-五个小土豆:mysql将一行转多行的方法
博客园-励志当个厨师:MySQL的JOIN(一):用法

以上是关于MySQL - 学习笔记 - 一行转多行的主要内容,如果未能解决你的问题,请参考以下文章

在线多行文本行转列工具

Mysql 字符串拆分 OR 一行转多行

MySQL表 一行数据转多行数据

MySql分隔符拆分查询(一行转多行)

Mysql中字段分割字符串( 一行转多行 )

vim学习笔记——vim操作