1. 程式人生 > >mysql逗號分隔字串成多行資料

mysql逗號分隔字串成多行資料

最近迷上將夜,就用主角做栗子了。

原始狀態
轉換後:
在這裡插入圖片描述
SQL程式碼

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

來來來,解釋一波

1.

on條件後面(length(a.userNames) - length(replace(a.userNames,’,’,’’))+1)這個語法,是得到被逗號分隔的欄位一共有幾個,

為什麼後面還有一個加1?

3+1=4;可以這樣理解,一根繩子剪三刀可以分成四段,同理一個主演名字串,三個逗號可以分隔出四個主演的名字。

既然是將一個欄位按照逗號分隔轉成多行,那麼現在已經確定了行數。

2.

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是連續的,且資料條數超過了你要轉換的行數即可