现有表user_submit如下:
题目:对于申请参与比赛的用户,blog_url字段中url字符后的字符串为用户个人博客的用户名,现在运营想要把用户的个人博客用户字段提取出单独记录为一个新的字段,请取出所需数据。
解题思路与步骤:
0.在例子中,用户名一直在列(blog_url)的最后,简单点的方法是直接substring_index(blog_url,'/',-1),但是考虑到现实中更多情况下,我们需要在strlist当中截取我们想要的字段。例如在'http:/ur/tigaer/home'中提取'tigaer'。由题可知,用户名一定在'url/'与下一个'/'之间。
1.先用replace()函数,将blog_url列中的'/'换成',',再用find_in_set()函数找到url的位置,最后将前步返回的索引加1得到用户名的索引;
SELECT device_id,blog_url,
REPLACE(blog_url,'/',',') blog_strlist,
(FIND_IN_SET('url',REPLACE(blog_url,'/',','))+1) blog_name_index
from user_submit
2.先用一次 substring_index()函数,截取一段字符strlist1并确保用户名在strlist1的最后一个位置;
SELECT *,SUBSTRING_INDEX(blog_url,'/',blog_name_index) fetch_str
from
(SELECT device_id,blog_url,
REPLACE(blog_url,'/',',') blog_strlist,(FIND_IN_SET('url',REPLACE(blog_url,'/',','))+1) blog_name_index
from user_submit) tab1
3.再用一次 substring_index()函数,选取最末尾的用户名(此时已经可以确定,fetch_str字段的最后一个词为用户名!);
SELECT device_id,SUBSTRING_INDEX(fetch_str,'/',-1) user_name
from
(SELECT *,SUBSTRING_INDEX(blog_url,'/',blog_name_index) fetch_str
from
(SELECT device_id,blog_url,
REPLACE(blog_url,'/',',') blog_strlist,(FIND_IN_SET('url',REPLACE(blog_url,'/',','))+1) blog_name_index
from user_submit) tab1) tab2
知识点总结:
1.replace(col,a,b)函数,用b替换col列中每个字段里的a;
2.substring_index(col,a,b)函数,col为一个字符串类的数据,a是分隔符,b是想找的位置(或者说指针),当b为正数时,返回从头到第b个(从头开始向尾数)str组成的strlist;当b为负数时,返回从尾到第-b个(从尾开始向头数)str组成的strlist。