sql技巧(四)找出用户最后一条记录和电话信息拆分
(1) 找到用户最后一一条记录
主要用了group_concat() 函数,把分组结果以","连接,指定排序规则 ,再用substring_index取走自己想要的位置
示例(2)把一列中的多值拆分为多行,其余列不变
工作中我们会遇到这样的问题,刚开始记录的时候表格是下面这个样子如表A,后续有数据库了希望按照关系型数据库的要求拆分成表B,不同人的信息记录条数不一致,好的一点是记录的分割服都是;
思考:这个思路很有意思,先把一行变成多行,然后对多行的数据进行替换!第一个问题用的主要是函数,第二个问题主要是思想
示例代码 表1(原始) 表2(辅助表) 中间表 表4(结果表)其中a、b列为辅助列,便于理解思考,实际取user,phone两列即可!
-------------------------------------------------
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