MySQL中GROUP BY分组排序获取topN相关的示例分析

这篇文章主要介绍MySQL中GROUP BY分组排序获取topN相关的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

MysqL VERSION : 5.5.45
ENGINE    : InnoDB

问题描述:
    获取成绩表中每位同学成绩排名前n的记录。

表结构:

MySQL中GROUP BY分组排序获取topN相关的示例分析



表数据:

MySQL中GROUP BY分组排序获取topN相关的示例分析



法一(用户变量):
①首先我先得到每组排名的所有结果

点击(此处)折叠或打开

  1. select @gp_row:=if(@name=name,@gp_row+1,1) as gp_row,@name:=name,id,name,grade from td ,(select @gp_row:=0,@name:='') as temp order by name,grade desc;

得到如下结果:

MySQL中GROUP BY分组排序获取topN相关的示例分析



②在把该结果作为中间表,查询top N的数据

点击(此处)折叠或打开

  1. select id ,name ,grade from (select @gp_row:=if(@name=name,@gp_row+1,1) as gp_row,@name:=name,id,name,grade from td ,(select @gp_row:=0,@name:='') as temp order by name,grade desc) as tb_gp_rank where gp_row<=2;

得到结果如下:

MySQL中GROUP BY分组排序获取topN相关的示例分析



③查看执行计划

MySQL中GROUP BY分组排序获取topN相关的示例分析


我们可以看到,对td使用了一个全表扫面(和索引字段相关和select,where字段相关等),并且用到了using filesort,当表记录数过多的时候效率肯定不高,这也没办法,数据无序以及没有相关索引以及select字段还有一些关系,但是这种查询方式基本可以满足这一类型的基本需求。

法二(union):
①在知道分组字段的情况下,可以使用union合并各组结果集

点击(此处)折叠或打开

  1. (select id ,name ,grade from td where name='tab' order by grade desc limit 2) union (select id ,name ,grade from td where name='lily' order by grade desc limit 2);

MySQL中GROUP BY分组排序获取topN相关的示例分析



②查看执行计划

MySQL中GROUP BY分组排序获取topN相关的示例分析


可以发现,在此种表结构下,union操作会扫n次全表(和索引字段相关),即多少个union结果集就有多少次。这种方法还需知道需要分组排序的具体的字段值,使用上有限制。

法三(子查询):
①子查询的方式适合选择并列top N的情况

点击(此处)折叠或打开

  1. select a.* from td a where (select count(*) from td where td.name=a.name and td.grade>a.grade)<2 order by name,grade desc;

MySQL中GROUP BY分组排序获取topN相关的示例分析


此时在插入一条数据 insert into td select null,'tab',76;
再次查询可得结果如下

MySQL中GROUP BY分组排序获取topN相关的示例分析


也就是说在排序之后最后一条数据如果有重复的则都会作为结果集返回,即第一次查询的结果,tab 成绩为44位于第二名的数据有两条。

法四(join连接):即把子查询转换为join连接,这里就不在测试。

以上是“MysqL中GROUP BY分组排序获取topN相关的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享内容对大家有帮助,更多相关知识,欢迎关注编程之家行业资讯频道!

相关文章

这篇文章主要介绍“hive和mysql的区别是什么”,在日常操作中...
这篇“MySQL数据库如何改名”文章的知识点大部分人都不太理解...
这篇文章主要介绍“mysql版本查询命令是什么”的相关知识,小...
本篇内容介绍了“mysql怎么修改字段的内容”的有关知识,在实...
这篇文章主要讲解了“mysql怎么删除unique约束”,文中的讲解...
今天小编给大家分享一下mysql怎么查询不为空的字段的相关知识...