mysql group by limit (根据某一分组,取固定条数) 实现

Posted woshihaiyong168

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql group by limit (根据某一分组,取固定条数) 实现相关的知识,希望对你有一定的参考价值。

小懒懒:IT公司php程序员

大坑比:小懒懒公司  产品



大坑比  需求:统计出    上次打boss周活动  每个服下   每个阵营  分数的前三名 我要的是后台功能  2秒之内显示出来!! (就是根据分数排名!!) 

小懒懒  : 额 知道了! (艹  数据量这么大 坑我吧 难道每个服,每一个阵营 一个一个的查?!这种可以但是查询要使用好几个sql 如果服务器多的话 .......)

小懒懒:mysql 中 没有 group by 分组 之内limit 功能吗?!  百度之后他绝望了!!!!

小懒懒:不行我把全部数据差出来过滤 ?! (数据量很大 PHP 消耗很大的 而且 出结果的数据很慢)


数据表结构:

CREATE TABLE `d_activity_momoking` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` bigint(20) NOT NULL COMMENT '用户编号',
  `faction` int(11) NOT NULL COMMENT '阵营:1.天宫,2.花果山',
  `week` int(11) NOT NULL COMMENT '第几周',
  `score` int(11) NOT NULL DEFAULT '0' COMMENT '积分',
  `server` int(11) NOT NULL DEFAULT '0' COMMENT '服务区编号',
  PRIMARY KEY (`id`),
  UNIQUE KEY `sign` (`uid`,`week`) USING BTREE
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;


理清思路: 大坑比的需求是要根据  week,server、faction 分组  ,再根据score 分数 倒序 取出 前三名!!

解决办法:

1、使用mysql 变量 实现排序字段

set @order_num=0; #定义一个排序字段
SELECT uid, week, score, @order_num:=@order_num+1 rownum FROM d_activity_momoking order by score desc limit 10; (无限制分数排序)



2、实现分组

需要分三个组  那我们先实现 week (时间)分组吧   就会让@week 等于 week字段  排序的时候根据week asc 排序

set @order_num=0;set @week='';
SELECT uid, week, score,case when @week = week then @order_num:=@order_num+1 else @order_num:=1 end rownum, @week:=week FROM d_activity_momoking order by week,score desc limit 15;


3、没有达到效果啊!  ( 最终 inner join 自己 查询)

set @order_num=0;set @week='';
select a.*,b.rownum  from d_activity_momoking a inner join (
    SELECT uid, week, score,case when @week = week then @order_num:=@order_num+1 else @order_num:=1 end rownum, @week:=week FROM d_activity_momoking order by week,score desc
) b on a.uid=b.uid and a.week=b.week where b.rownum <=5
;


实现了 week 时间分组!!!  还有分组怎么办 继续完善sql !!


4.set @order_num=0;set @week='';set @server='';set @faction='';
select a.*,b.rownum from d_activity_momoking a inner join (
    SELECT uid, week,score,faction,case when @week = week and @server=`server` and @faction=`faction` then @order_num:=@order_num+1 else @order_num:=1 end rownum,
    @week:=week,@server:=`server`,@faction:=faction FROM d_activity_momoking  order by week,`server`,faction,score desc
) b on b.uid=a.uid and  b.week=a.week   where b.rownum<=3; 

#注意 其他关键字段 asc 升序 哦

各周  1服  3服 (数据中只有1,3服)  阵营1  和 2  的前三名就查询出来了!!!!


小懒懒: 大坑比 你过来  是不是 你要的效果!!!!!!



以上数据为测试数据 大约5W左右   87ms出数据!!(好快哦 !!!)









以上是关于mysql group by limit (根据某一分组,取固定条数) 实现的主要内容,如果未能解决你的问题,请参考以下文章

MySQL分组条件,group by order by limit 顺序

mysql笔记--group by,limit用法

MYSQL05_ORDR BY排序LIMIT分组GROUP BY分组

MySql学习 —— where / having / group by / order by / limit 简单查询

mysql的group by优化跟limit优化

MySQL-SQL优化:主键,order by,group by,limit,count,update