mysql 分组查询某一列最大的前10条记录

场景:

举例,有一个用户做题记录的表,

create table test(

id bigint(20) primary key comment '主键id',

userId bigint(20) comment'用户id',

count int(10) comment'做题数量',

cost int(10) comment'完成做题消耗的时间,单位秒'

);

现在表中有5条数据

iduseridcountcost
110063
210164
310075
410152
510253

需求:

查询出每个用户最多的做题数的数据,并按照做题数量倒序,完成时间正序排列,即最终结果

10075
10164
10253

sql:

方案1(错误):

select userid,max(count) count,cost from test group by userid order by count desc,cost limit 0,10;

结果:

10073
10164
10253

用户 100 做题数量7 对应的耗时却是3,明显不正确

方案2:

select userid,max(count),cost from (

select userid,count,cost from test order by count desc,cost

) as t group by userid order by count desc,cost limit 0,10;

j结果:

10075
10164
10253

符合预期结果

猜测:

方案1查询的时候是按照主键去排序的,接着在做分组(group by)的时候,顺序遍历,因为没有对cost做聚合,所以没有覆盖操作;

方案2查询的时候按照需求先做了排序,接着做分组(group by),由于已经对数据做了排序,所以每个用户的第一条数据就是满足要求的数据。

其他:

方案2 得到的结果虽然满足需求,但是依赖于mysql内部对group by 的处理逻辑,如果服务器做了版本调整,可能就得不到想要的结果了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值