bbjoe
2016-07-27 18:23
这句话是这样的:
replace(substring(substring_index(mobile,',',a.id),char_length(substring_index(mobile,',',a.id-1))+1),',','') as mobile
从外到内是:
1.把【substring(substring_index(mobile,',',a.id),char_length(substring_index(mobile,',',a.id-1))+1)】中的逗号替换为空;
2.把【substring_index(mobile,',',a.id)】这个字符串,从第【char_length(substring_index(mobile,',',a.id-1))+1】个字符开始截取,直到末尾;
3.【substring_index(mobile,',',a.id)】这个字符串表示把mobile按逗号分隔,从第a.id个逗号算起,获取左侧字符串;
4.【char_length(substring_index(mobile,',',a.id-1))+1】要从里面的【substring_index(mobile,',',a.id-1)】说起;
5.【substring_index(mobile,',',a.id-1)】表示把mobile按逗号分隔,从第a.id-1个逗号算起,获取左侧字符串,这里比3中的字符串总是少了一个电话号码(少算一个逗号);
6.【char_length(substring_index(mobile,',',a.id-1))+1】是要计算【substring_index(mobile,',',a.id-1)】的长度,+1是因为5比3多截了一个逗号;
比如:原本mobile = 电1,电2,电3
substring_index(mobile, ',', 2) = 电1,电2
substring_index(mobile, ',', 1) = 电1
7.现在问题相当于是(接着上面的例子):replace(substring('电1,电2', len(电1)+1), ',', ''),结果为'电2'。也就说 id 为多少就截取第几个电话号码。
对于最终表格:
user_name 是直接从 CROSS JOIN 表里选出来的,因此也有那么多行,而每行其实也有对应的 id (也是没变,但因为没有SELECT所以看不见)
而 mobile 则是用 id 值(隐藏)进行 replace 语句替换后的结果(别名)
# 老师一句“简单的截取转换……” 结果我想了快一个小时
还没有人回答问题,可以看看其他问题
MySQL开发技巧(二)
61864 学习 · 30 问题
相似问题