由于MySQ没有提供像Oracle的dense_rank()或者row_number() over(partition by)等函数,来实现组内排序,想实现这个功能,还是得自己想想办法,最终通过创建行号实现。

方法一:


  1.建立测试表

# 建表
DROP TABLE test;
CREATE TABLE test (myNAME VARCHAR (10),name1 VARCHAR (10),count1 BIGINT
);

  2.删除原有数据

# 删除原有数据
DELETE FROM test;
SELECT * FROM test;

  3.插入数据

# 插入数据
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','1',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);

  4.查询

# 查询
SELECT * FROM test;

  5.构造行号rownum

#---- 构造rownum ----
SELECT b.myNAME, b.name1, b.count1,IF(@name = b.myNAME, @rank := @rank + 1, @rank := 1) -- 3.判断name是否等于此行的myNAMEAS rank,   -- 如果是,则rank自增;如果不是,则初始化rank=1@name := b.myNAME
FROM
(SELECT myNAME, name1, count1 FROM test
ORDER BY myNAME ASC, count1 DESC) b,  -- 1.先进行子查询 排序
(SELECT @rownum := 0,@name := NULL, -- 2.初始化rownum=0,name=NULL, rank=0@rank := 0) a;

  6.筛选组内前五(即行数小于等于5的行)

SELECT myNAME, name1, count1, rank
FROM
(SELECT b.myNAME, b.name1, b.count1,IF(@name = b.myNAME, @rank := @rank + 1, @rank := 1) -- 3.判断name是否等于此行的myNAMEAS rank,   #-- 如果是,则rank自增;如果不是,则初始化rank=1@name := b.myNAME
FROM
(SELECT myNAME, name1, count1 FROM test
ORDER BY myNAME ASC, count1 DESC) b,  -- 1.先进行子查询 排序
(SELECT @rownum := 0,@name := NULL, -- 2.初始化rownum=0,name=NULL, rank=0@rank := 0) a) result
WHERE rank <=5;

方法二:


  1.关联

SELECT *
FROM test a
JOIN test b
ON a.`myNAME` = b.`myNAME` AND a.`count1` <= b.`count1`;

  2.排序

SELECT *
FROM test a
JOIN test b
ON a.`myNAME` = b.`myNAME` AND a.`count1` <= b.`count1`
ORDER BY a.`myNAME` ASC, a.`count1` DESC;

  3.最终实现

SELECT a.myNAME,a.name1,a.count1,COUNT(*) AS rank
FROM test a
JOIN test b ON a.`myNAME` = b.`myNAME` AND a.`count1` <= b.`count1`
GROUP BY a.`myNAME`,a.`name1`,a.`count1`
ORDER BY a.`myNAME` ASC, a.`count1` DESC;

方法三:


  其实方法三只是方法二的补充,针对有数据相等的情况。

SELECT
a.myNAME,
a.name1,
a.count1,
COUNT(1) AS rank
FROM
test AS a,
test AS b
WHERE a.myNAME = b.myNAME
AND a.count1 < b.count1
OR (a.count1 = b.count1 AND a.myNAME <= b.myNAME)
GROUP BY a.myNAME, a.name1, a.count1
ORDER BY a.myNAME ASC, rank ASC;


END 2018-05-2510:54:26

转载于:https://www.cnblogs.com/hider/p/9087374.html

MySQL学习笔记:三种组内排序方法相关推荐

  1. MySQL学习笔记(三)查询

    写在前面:本篇为作者自学总结,学习内容为课堂所学和网络学习笔记汇总,对于内容引用部分在文中和文末注明. 文章仅供参考,如需深入了解,请查阅MySQL参考手册.附上下载链接: 链接:https://pa ...

  2. MYSQL学习笔记三:日期和时间函数

    MYSQL学习笔记三:日期和时间函数 1. 获取当前日期的函数和获取当前时间的函数 /*获取当前日期的函数和获取当前时间的函数.将日期以'YYYY-MM-DD'或者'YYYYMMDD'格式返回 */ ...

  3. mysql学习笔记三 —— 数据恢复与备份

    要点: 1.存储引擎 2.导入导出 3.备份与恢复 查看当前数据库中的所有表 use db1: show tables: 1.存储引擎 不同的发动机(引擎)适用的汽车类型不一样. 存储和处理的不同方式 ...

  4. parallelstream启动的线程数_高并发与多线程网络学习笔记(三)线程组和线程池

    线程组 线程组的作用是:可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织. 构造函数 ThreadGroup(String name)//默认parent为当前线程组 ThreadGro ...

  5. 步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method)

    一.Inline  Method 概述 一个函数,其本体(method body)应该与其名称(method name)同样清楚易懂. 动机(Motivation) 以简短的函数表现动作意图,这样会使 ...

  6. mysql的基本数据类型_mysql基本数据类型(mysql学习笔记三)

    Mysql数据类型 小数: 浮点:小数位可以变化 Float单精度默认精度6位左右 Double双精度默认精度16位左右 支持,控制数值范围 Type(M,D) M表示所有数值位数(不包括小数点和符号 ...

  7. MySQL学习笔记(三)

    准备好一个表的员工,接下来都是对这个表进行操作 一,数据表里内容的修改和删除(更改,删除) 1.1增加一列数据 格式:alter table 表名 add column 列名 数据类型(数据长度); ...

  8. ssm上传文件进度条_ssm学习笔记-三种文件上传方式

    首先需要引入commons-fileupload commons-fileupload commons-fileupload 1.3.3 MultipartFile方式 示例代码: @RequestM ...

  9. MySQL学习笔记三:  1. 多表查询     2. 事务     3. DCL

    ## 多表查询:     * 查询语法:         select             列名列表         from             表名列表         where.... ...

最新文章

  1. 如何解决动态查询语句太长,大于数据库字符的最大长度
  2. Leetcode 769. Max Chunks To Make Sorted
  3. 全部编程皆为Web编程
  4. 前端技巧|Chrome上4款超级实用的插件!
  5. js(Dom+Bom)第二天(2)
  6. 坑了腾讯1624万!3人冒充老干妈员工诈骗腾讯 判决结果来了...
  7. 程序员选手机那些事儿
  8. char*和CString转换
  9. C#代码执行中等待10秒
  10. 从零开始使用webpack 4, Babel 7创建一个React项目
  11. JavaScript内置对象之Array对象总结(附实例)
  12. 保持头脑清醒的窍门2/13
  13. ic启动器怎么导入模组_Model Y和Model 3的模组拆解对比
  14. 磁盘分区 如何分出整数
  15. swf转html5批量转换,gif转swf转换工具,gif转swf格式转换器|批量转换
  16. 禅与摩托车维修艺术,又名万里任禅游
  17. 微擎添加绑定公众号,空白页或500错误,打不开
  18. 深度学习(17)—— 度量学习
  19. ios与android指纹识别,iOS开发实现TouchID指纹解锁
  20. 史上最详细的讲解,第一次如何上传本地代码到github

热门文章

  1. 通向财务自由之路08_入市或市场时机选择
  2. 读书笔记_打开量化投资的黑箱10
  3. vim python补全_转:VIM python 自动补全插件:pydiction
  4. mongodb空间查询java,java查看mongodb集合表空间大小
  5. python查看指令的方法python -h
  6. ecshop 后台添加评论_技术小白如何添加服务号模板消息?服务号的模板消息功能到底该怎么使用?...
  7. python web框架哪个好_盘点:9款流行Web框架及其优缺点
  8. C++递归以及内存值的传递
  9. GNN在谱域下的演化:Spectral CNN,ChebyNet,GCN
  10. 解线性方程组的迭代法(雅可比迭代法)