方法一:如果每条数据的被逗号分隔的数量在637条以内,使用mysql.help_topic(mysql自带的表,只有637个序号)。
selecta.id,a.enclosure_ids,
SUBSTRING_INDEX(SUBSTRING_INDEX(a.enclosure_ids,',',b.help_topic_id+1),',',-1)split
fromam_voucheraleftjoinmysql.help_topicb
ONb.help_topic_id<(length(a.enclosure_ids)-length(REPLACE(a.enclosure_ids,',',''))+1)
方法二:如果逗号数量在636个以外,并且原表行数超过逗号分隔的数量。
SELECTid,enclosure_ids,
SUBSTRING_INDEX(SUBSTRING_INDEX(enclosure_ids,',',rownums),',',-1)ASsplit
FROMam_voucherajoin
(SELECT@rownum:=@rownum+1ASrownumsFROM(SELECT@rownum:=0)a,am_voucherb)b
onrownums<=(length(a.enclosure_ids)-length(REPLACE(a.enclosure_ids,',',''))+1)
弊端:1.会忽略null值。2.(重要)假设原表中只有2行数据,但是其中一个字符串被逗号分割为大于2条的数据,那么split所在的那条数据就只会拆分出前2条数据。
逻辑解释:
1.length(a.enclosure_ids)-length(REPLACE(a.enclosure_ids,‘,’,‘’))+1
字段原长度-字段去除掉逗号的长度+1,得到通过逗号分割后有几条数据。
2.SUBSTRING_INDEX(SUBSTRING_INDEX(a.enclosure_ids,‘,’,b.help_topic_id+1),‘,’,-1)
里面的SUBSTRING_INDEX是从每个逗号循环截取字符串,如下
外面的SUBSTRING_INDEX是根据里面的数据取最后一个逗号后面的数据。
|