sql技巧(四)找出用户最后一条记录和电话信息拆分

(1) 找到用户最后一一条记录

主要用了group_concat() 函数,把分组结果以","连接,指定排序规则 ,再用substring_index取走自己想要的位置

示例

参考1-最后一条记录

(2)把一列中的多值拆分为多行,其余列不变

工作中我们会遇到这样的问题,刚开始记录的时候表格是下面这个样子如表A,后续有数据库了希望按照关系型数据库的要求拆分成表B,不同人的信息记录条数不一致,好的一点是记录的分割服都是;

思考:这个思路很有意思,先把一行变成多行,然后对多行的数据进行替换!第一个问题用的主要是函数,第二个问题主要是思想


sql技巧(四)找出用户最后一条记录和电话信息拆分_第1张图片
示例代码


表1(原始)
sql技巧(四)找出用户最后一条记录和电话信息拆分_第2张图片
表2(辅助表)


sql技巧(四)找出用户最后一条记录和电话信息拆分_第3张图片
中间表
sql技巧(四)找出用户最后一条记录和电话信息拆分_第4张图片
表4(结果表)

其中a、b列为辅助列,便于理解思考,实际取user,phone两列即可!

参考2-列转化为行

-------------------------------------------------

SELECT roleid ,

SUBSTRING_INDEX(

GROUP_CONCAT(logintime  ORDER BY logintime DESC)  # GROUP_CONCAT  对查查询结果进汇总以“,”相连

,",",1) AS  logintime          #取出字符串第一个位置的字符

FROM  rolelogin as a

WHERe  a.logintime >'2017-09-07 00:00:00' and  a.logintime <'2017-09-08 00:00:00'

GROUP BY roleid

--------------------------------

SELECT user ,SUBSTRING_INDEX(mobile,";",a.id) as a ,concat(SUBSTRING_INDEX(mobile,";",a.id-1 ),';') as b ,

REPLACE(SUBSTRING_INDEX(mobile,";",a.id),concat(SUBSTRING_INDEX(mobile,";",a.id-1 ),';'),"")  as  phone  #根据SUBSTRING_INDEX函数的特性,替换(a.id-1)部分为 为空值,取出a.id

FROM

id  as  a

CROSS JOIN

(SELECT  user,CONCAT(phone,";") as  mobile ,LENGTH(phone)-LENGTH(replace(phone,';','')) +1 as size  #确定要拆分成几行

FROM phonenuber ) as  b

on a.id <= b.size

你可能感兴趣的:(sql技巧(四)找出用户最后一条记录和电话信息拆分)