SQL查询优化:行变列的思路~

目录

前言

一、什么时候要使用行变列?

二、行变列思路:聚合函数+判断

1.针对上面的问题,我的SQL实现

2.分析上述代码

总结


前言

在写项目时,我在对统计信息如播放量,订阅量等的查询时,经常要使用行变列的操作,那么这篇文章就来教你如何进行行变列,以及什么时候要进行行变列操作。

一、什么时候要使用行变列?

        在项目中,我们对动态,专辑,视频等信息的查询绕不开的就是——对他们统计信息的查询。

        我们举个例子说明:如下图,stat_type对应的是统计信息的编号,stat_num是这些信息对应的数量。我们可以发现每1条专辑数据对应了4条统计数据,这导致每个专辑的查询结果也是4条。为什么会有4条?那是因为我们在设计表时,一般会将这些统计数据与源数据解耦,这会导致我们查询时需要联表查询,那么每种统计数据就对应了一条查询结果。我这里是4种统计数据,分别是0401-播放量 0402-订阅量 0403-购买量 0403-评论数

然而我们想要的查询结果却是这种,一条数据就能展现该专辑的所有统计数据:

那么我们就要进行行变列的过程了。

二、行变列思路:聚合函数+判断

1.针对上面的问题,我的SQL实现

声明我是基于mybatis框架进行的sql查询。

代码如下:

select album.id albumId, album.album_title, album.cover_url, album.include_track_count,
       album.is_finished, album.status,
       max(if(stat.stat_type = '0401', stat_num, 0)) as playStatNum,
       max(if(stat.stat_type = '0402', stat_num, 0)) as subscribeStatNum,
       max(if(stat.stat_type = '0403', stat_num, 0)) as buyStatNum,
       max(if(stat.stat_type = '0404', stat_num, 0)) as commentStatNum
from tingshu_album.album_stat stat inner join
     tingshu_album.album_info album on album.id = stat.album_id
where user_id = #{vo.userId} and stat.is_deleted = 0
group by album.id
order by album.id desc

2.分析上述代码

分组后每组数据的stat.num为不同含义的四种值,别名playStatNum,subscribeStatNum,buyStatNum,commentStatNum。正常查出来是每组4条数据,我们想让这4种值变为列,这样每组的数据就变成1条方便处理。我们首先使用if函数判断,它会遍历本组的4个stat_type值,匹配后我们取出改stat_num然他成为新的列,但问题是if函数要判断4个stat_type值,这4个中必然有3个不同,最后导致出现0的错误结果。解决方案是我们再通过MAX聚合函数,取出最大值即为正确结果

那么对于其他的例如动态的统计数据,视频的统计数据我们大可以采用相同的思路进行。


总结

以上就是今天要讲的内容,本文仅仅介绍了一种对行变列的问题我们的解决思路,如果读者大佬有更好的解决思路,欢迎评论区留言供大家学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值