2020-8-14 mysql进阶 行转列问题

这里写目录标题

  • 一、字符串切割&&行转列
    • 1.与表关联
    • 2.切割字符
    • 3.解释:
    • 4.sql解析

一、字符串切割&&行转列

1.与表关联

举例:表a
2020-8-14 mysql进阶 行转列问题_第1张图片

select distinct 
substring_index(substring_index(a.q,';',b.help_topic_id+1),';',-1) ss
from  a  join  mysql.help_topic b
on b.help_topic_id < (length(a.q) - length(replace(a.q,';',''))+1)

结果:
2020-8-14 mysql进阶 行转列问题_第2张图片

2.切割字符

SELECT 
SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1) AS num 
FROM 
mysql.help_topic 
WHERE 
help_topic_id < LENGTH('7654,7698,7782,7788')-LENGTH(REPLACE('7654,7698,7782,7788',',',''))+1

2020-8-14 mysql进阶 行转列问题_第3张图片

3.解释:

1.字符串分隔函数:SUBSTRING_INDEX(str, delim, count)
str     需要拆分的字符串
delim    分隔符,通过某字符进行拆分
count    当 count 为正数,取第 n 个分隔符之前的所有字符; 当 count 为负数,取倒数第 n 个分隔符之后的所有字符。
举例: 取第2个分隔符之前的所有字符
2020-8-14 mysql进阶 行转列问题_第4张图片

2.替换函数replace( str, from_str, to_str)
参数名   解释
str      需要进行替换的字符串
from_str   需要被替换的字符串
to_str     替换后的字符串

举例:
2020-8-14 mysql进阶 行转列问题_第5张图片

3.help_topic:一般为系统表,轻易不要修改,那么可以自己新建一个表,help_index,里面就一个字段help_index_id,只要保证这个表里面有较多数据,就可以了.

4.sql解析

-- where条件的含义是求出有多少列
help_topic_id < LENGTH('7654,7698,7782,7788')-
LENGTH(REPLACE('7654,7698,7782,7788',',',''))+1
-- 条件 
SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1)
-- 当 help_topic_id = 0时,获取到的字符串 = 7654 
-- 当 help_topic_id = 1时,获取到的字符串 = 7654,7698
-- 如下图: 两次循环自然就去掉了所有字符

2020-8-14 mysql进阶 行转列问题_第6张图片

你可能感兴趣的:(mysql,mysql,数据库)