关于MYSQL中每个用户取1条记录的问题(group by xxx)

 

 昨天遇到一个问题,视频浏览历史记录,数据因需要客服统计视频播放量、播放时长以及各分类的喜好度所以播放信息要尽量的完整,但客户看到的历史又不能重复,且展示的是最后一次播放的时长以便继续观看。

数据展示如下:



 进行正常的排序分组执行sql语句:

select vpl.user_id, vc.cat_name, v.id as videoId, v.video_name as videoName ,vpl.create_time, vpl.play_times 
from zg_video_playlog vpl 
left join zg_video v on vpl.video_id=v.id 
left join zg_video_cat vc  on vc.id=v.cat_id 
group by vpl.video_id 
ORDER BY vpl.id desc 

 结果如下:



 注意:

按数据展示来看,最后一次访问的数据应为id=12的数据在第一位,且播放时间应为03-21日,明显这不是我想要的数据

 

 根据上面的分析,group by到select时只取到分组里的第一条信息。解决方案如下:

第一步:max()



 根据结果来看,我们已经拿到了最新观看的顺序,但还是有问题观看的时间还不是3-20,如果我们只要保证顺序用这个方法是完全没问题的。

第二步:

先排序,然后group,这样的话自然可以取到最适合的一条数据可以试试

select vpl.id as vplId, v.id as videoId, v.thumb, v.video_name, v.video_url, vpl.user_id, vpl.create_time , vpl.play_times as playTimes , v.look_front, v.summary
from (select * from zg_video_playlog vpl where vpl.user_id=521  order by vpl.id desc) `vpl` 
left join zg_video v on vpl.video_id=v.id
left join zg_video_cat vc  on vc.id=v.cat_id 
group by vpl.video_id 
order by vpl.id desc

 

 达到效果!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值