博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql分析函数的实现
阅读量:7122 次
发布时间:2019-06-28

本文共 3492 字,大约阅读时间需要 11 分钟。

今天收到同事的一需求,要求实现以下功能:

drop table test;

create table test(name varchar(10),name1 varchar(10),count bigint);

delete from test;

insert into test values(‘1′,’a’,2);

insert into test values(‘1′,’b’,1);;

insert into test values(‘1′,’c’,4);

insert into test values(‘1′,’d’,5);

insert into test values(‘1′,’e’,7);

insert into test values(‘1′,’f’,8);

insert into test values(‘2′,’g’,9);

insert into test values(‘2′,’h’,0);

insert into test values(‘2′,’i’,21);

insert into test values(‘2′,’j’,3);

insert into test values(‘2′,’k’,4);

insert into test values(‘2′,’l’,56);

insert into test values(‘3′,’m’,67);

insert into test values(‘3′,’n’,89);

insert into test values(‘3′,’o’,12);

insert into test values(‘3′,’p’,22);

insert into test values(‘3′,’q’,23);

insert into test values(‘3′,’r’,42);

insert into test values(‘3′,’s’,26);

 

根据name字段分组,取出改组内的前4项,并且按照count字段进行降序排序,由于mysql没有oracle中的分析函数,看上去很简单的需求,但是折腾了许久,还是没有实现,于是乎在网上收罗了一下mysql分析函数是怎么 ,找到了mysql分析函数的解决办法,学习了一下,于是乎把同事的功能实现了;

select name, name1, count  from (select b.name, b.name1, b.count,

if(@name = b.name, @rank := @rank + 1, @rank := 1) as rank,@name:=b.name

from (select name, name1, count    from test order by name asc, count desc) b,

(select @rownum := 0, @name := null, @rank := 0) a) result where rank<5;

| name | name1 | count |+——+——-+——-+| 1    | f     |     8 || 1    | e     |     7 || 1    | d     |     5 || 1    | c     |     4 || 2    | l     |    56 || 2    | i     |    21 || 2    | g     |     9 || 2    | k     |     4 || 3    | n     |    89 || 3    | m     |    67 || 3    | r     |    42 || 3    | s     |    26 |+——+——-+——-+12 rows in set (0.02 sec)

如果上面的sql初次看到有些让人摸不着头脑的话,你可以看看他的执行计划,然后从执行计划得到一些执行流程,该sql中最核心的技术点为使用自定义变量来保存sql执行过程中的值:

if(@name = b.name, @rank := @rank + 1, @rank := 1) as rank,@name:=b.name

这条判断语句对下面结果进行处理,并生成rank,由于下面查询的结果中对name做了排序,所以@name:=b.name使的相同name值的rank能够递增;

+—-+————-+————+——–+—————+——+———+——+——+—————-+| id | select_type | table      | type   | possible_keys | key  | key_len | ref  | rows | Extra          |+—-+————-+————+——–+—————+——+———+——+——+—————-+|  1 | PRIMARY     | 
| ALL | NULL | NULL | NULL | NULL | 19 | Using where || 2 | DERIVED |
| system | NULL | NULL | NULL | NULL | 1 | || 2 | DERIVED |
| ALL | NULL | NULL | NULL | NULL | 19 | || 4 | DERIVED | NULL | NULL | NULL | NULL | NULL | NULL | NULL | No tables used || 3 | DERIVED | test | ALL | NULL | NULL | NULL | NULL | 19 | Using filesort |

如果你对下面的select @rownum := 0, @name := null, @rank := 0看不太明白,可以改写一下sql:

select name, name1, count  from (select b.name, b.name1,b.count,

if(@name = b.name, @rank := @rank + 1, @rank := 1) as rank,@name:=b.name

from (select name, name1, count,@rownum := 0, @name := null, @rank := 0

from test order by name asc, count desc) b) result where rank<4;

+—-+————-+————+——+—————+——+———+——+——+—————-+| id | select_type | table      | type | possible_keys | key  | key_len | ref  | rows | Extra          |+—-+————-+————+——+—————+——+———+——+——+—————-+|  1 | PRIMARY     | 
| ALL | NULL | NULL | NULL | NULL | 19 | Using where || 2 | DERIVED |
| ALL | NULL | NULL | NULL | NULL | 19 | || 3 | DERIVED | test | ALL | NULL | NULL | NULL | NULL | 19 | Using filesort |+—-+————-+————+——+—————+——+———+——+——+—————-+

转载地址:http://dxoel.baihongyu.com/

你可能感兴趣的文章
windows系统下PHP环境高承压,高稳定解决方案
查看>>
一个32岁入门的70后程序员给我的启示
查看>>
jsp&Servlet(4)
查看>>
谷歌下,因为给外层大容器设置 overflow:visible; 而导致问题,IE、火狐正常
查看>>
【cocos2d-js官方文档】事件分发监听机制(摘录)
查看>>
Unity3d 札记-Survival Shooting 知识点汇总--受到伤害时屏幕闪血光如何做到
查看>>
dubbo初认知(dubbo和springCloud关系,在微服务架构中的作用等)(持续更新中)...
查看>>
【Autoprefixer】Hbuilder中配置Autoprefixer
查看>>
mysql-5.7 Using Asynchronous I/O on Linux详解
查看>>
【node.js】REPL(交互式解释器)
查看>>
python中实现多线程的几种方式
查看>>
3DSMAX安装未完成,某些产品无法安装的解决方法
查看>>
写给对MCU感兴趣的读者
查看>>
庆祝访问过百万
查看>>
leetcode 4. Median of Two Sorted Arrays
查看>>
树与二叉树(一)
查看>>
Tomcat 学习进阶历程之Tomcat架构与核心类分析
查看>>
Wps 2013 拼音标注两种方式分析
查看>>
dedecms列表页文章有图调用缩略图 无图留空或自定义图片的方法!
查看>>
安装mysql 5.7.19.0 之前要安装的东西
查看>>