最近迷上将夜,就用主角做栗子了。
转换后:
SQL代码
1 2 3 4 5 |
select substring_index(substring_index(a.userIds,',',b.help_topic_id+1),',',-1) id, substring_index(substring_index(a.userNames,',',b.help_topic_id+1),',',-1) username from jiangye_actor a join mysql.help_topic b on b.help_topic_id < (length(a.userNames) - length(replace(a.userNames,',',''))+1) |
substring_index函数的用法可以参考这篇博客 https://www.cnblogs.com/mqxs/p/7380933.html
来来来,解释一波
on条件后面(length(a.userNames) – length(replace(a.userNames,’,’,’’))+1)这个语法,是得到被逗号分隔的字段一共有几个,
为什么后面还有一个加1?
3+1=4;可以这样理解,一根绳子剪三刀可以分成四段,同理一个主演名字串,三个逗号可以分隔出四个主演的名字。
既然是将一个字段按照逗号分隔转成多行,那么现在已经确定了行数。
substring_index(substring_index(a.userNames,’,’,b.help_topic_id+1),’,’,-1)的理解如下图:
mysql.help_topic这张表我们只用到了它的help_topic_id,可以看到这个help_topic_id是从0开始一直连续的,join这张表只是为了确定数据行数。现在假设我的mysql.help_topic一共只有5条数据,那么最多可转成5行数据,若果现在主演的名字有6个就不能用mysql.help_topic这张表了。
由此看出我们完全可以找其他表来替代mysql.help_topic,只要满足表的id是连续的,且数据条数超过了你要转换的行数即可。
from:https://blog.csdn.net/XDSXHDYY/article/details/84589486