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

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

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

示例

参考1-最后一条记录

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

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

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


示例代码


表1(原始)
表2(辅助表)


中间表
表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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容