目录
前言
在写项目时,我在对统计信息如播放量,订阅量等的查询时,经常要使用行变列的操作,那么这篇文章就来教你如何进行行变列,以及什么时候要进行行变列操作。
一、什么时候要使用行变列?
在项目中,我们对动态,专辑,视频等信息的查询绕不开的就是——对他们统计信息的查询。
我们举个例子说明:如下图,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聚合函数,取出最大值即为正确结果
。
那么对于其他的例如动态的统计数据,视频的统计数据我们大可以采用相同的思路进行。
总结
以上就是今天要讲的内容,本文仅仅介绍了一种对行变列的问题我们的解决思路,如果读者大佬有更好的解决思路,欢迎评论区留言供大家学习!