MySQL不使用order by实现排名的三种思路总结


Posted in MySQL onJune 02, 2021

假定业务:

查看在职员工的薪资的第二名的员工信息

创建数据库

drop database if exists emps;
create database emps;
use emps;

create table employees(
    empId int primary key,-- 员工编号
    gender char(1) NOT NULL, -- 员工性别
	hire_date date NOT NULL -- 员工入职时间
   	);
create table salaries(
    empId int primary key, 
    salary double -- 员工薪资
    );
    
INSERT INTO employees VALUES(10001,'M','1986-06-26');
INSERT INTO employees VALUES(10002,'F','1985-11-21');
INSERT INTO employees VALUES(10003,'M','1986-08-28');
INSERT INTO employees VALUES(10004,'M','1986-12-01');
INSERT INTO salaries VALUES(10001,88958);
INSERT INTO salaries VALUES(10002,72527);
INSERT INTO salaries VALUES(10003,43311);
INSERT INTO salaries VALUES(10004,74057);

题解思路

1、(基础解法)

先查出salaries表中最高薪资,再以此为条件查出第二高的工资

查询语句如下:

select
	E.empId,E.gender,E.hire_date,S.salary
from
	employees E join salaries S 
on 
	E.empId = S.empId
where	
	S.salary=
	(
    select max(salary)from salaries 
    where 
        salary<
        (select max(salary) from salaries)
    );
-- ---------------查询结果------------ --
+-------+--------+------------+--------+
| empId | gender | hire_date  | salary |
+-------+--------+------------+--------+
| 10004 | M      | 1986-12-01 |  74057 |
+-------+--------+------------+--------+

2、(自联结查询)

先对salaries进行自联结查询,当s1<=s2链接并以s1.salary分组,此时count的值,即薪资比他高的人数,用having筛选count=2 的人,就可以得到第二高的薪资了;

查询语句如下:

select
	E.empId,E.gender,E.hire_date,S.salary
from
	employees E join salaries S 
on 
	E.empId = S.empId
where S.salary=
	(
    select 
        s1.salary
    from 
        salaries s1 join salaries s2 
    on 
        s1.salary <= s2.salary
    group by 
        s1.salary              
  	having
  	 count(distinct s2.salary) = 2
    );
-- ---------------查询结果------------ --
+-------+--------+------------+--------+
| empId | gender | hire_date  | salary |
+-------+--------+------------+--------+
| 10004 | M      | 1986-12-01 |  74057 |
+-------+--------+------------+--------+

3、(自联结查询优化版)

原理和2相同,但是代码精简了很多,上面两种是为了引出最后这种方法,在很多时候group by和order by都有其局限性,对于俺们初学者掌握这种实用性较广的思路,还是很有意义的。

select
	E.empId,E.gender,E.hire_date,S.salary
from
	employees E join salaries S 
on
    S.empId =E.empId
where
    (select count(1) from salaries where salary>=S.salary)=2;
-- ---------------查询结果------------ --
+-------+--------+------------+--------+
| empId | gender | hire_date  | salary |
+-------+--------+------------+--------+
| 10004 | M      | 1986-12-01 |  74057 |
+-------+--------+------------+--------+

初浅总结,如有错误,还望指正。

总结

到此这篇关于MySQL不使用order by实现排名的三种思路的文章就介绍到这了,更多相关MySQL不用order by排名内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL索引知识的一些小妙招总结
May 10 MySQL
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
May 25 MySQL
Mysql中调试存储过程最简单的方法
Jun 30 MySQL
MySQL 如何限制一张表的记录数
Sep 14 MySQL
mysql如何能有效防止删库跑路
Oct 05 MySQL
mysql中varchar类型的日期进行比较、排序等操作的实现
Nov 17 MySQL
MySQL学习之基础命令实操总结
Mar 19 MySQL
mysql 获取时间方式
Mar 20 MySQL
mysql的Buffer Pool存储及原理
Apr 02 MySQL
排查并解决MySQL生产库内存使用率高的报警
Apr 11 MySQL
MySQL如何使备份得数据保持一致
May 02 MySQL
MySQL连接查询你真的学会了吗?
Jun 02 #MySQL
SQL注入的实现以及防范示例详解
Jun 02 #MySQL
如何自己动手写SQL执行引擎
MySQL 8.0 Online DDL快速加列的相关总结
MySQL 常见存储引擎的优劣
Jun 02 #MySQL
Mysql文件存储图文详解
一文读懂navicat for mysql基础知识
You might like
新闻分类录入、显示系统
2006/10/09 PHP
linux中cd命令使用详解
2015/01/08 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
PHPExcel 修改已存在Excel的方法
2018/05/03 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
JavaScript的面向对象方法以及差别
2008/03/31 Javascript
IE浏览器打印的页眉页脚设置解决方法
2009/12/08 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
js实现创建删除html元素小结
2015/09/30 Javascript
JavaScript制作淘宝星级评分效果的思路
2020/06/23 Javascript
Spring MVC中Ajax实现二级联动的简单实例
2016/07/06 Javascript
json与jsonp知识小结(推荐)
2016/08/16 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
详解jQuery插件开发方式
2016/11/22 Javascript
JQuery判断正整数整理小结
2017/08/21 jQuery
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
微信小程序实现分享朋友圈的图片功能示例
2019/01/18 Javascript
JavaScript 作用域实例分析
2019/10/02 Javascript
JS使用Chrome浏览器实现调试线上代码
2020/07/23 Javascript
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
Django查询数据库的性能优化示例代码
2017/09/24 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
2019/03/18 Python
Django如何将URL映射到视图
2019/07/29 Python
pytorch实现onehot编码转为普通label标签
2020/01/02 Python
浅谈JupyterNotebook导出pdf解决中文的问题
2020/04/22 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
Python xlwings插入Excel图片的实现方法
2021/02/26 Python
简洁自适应404页面HTML好看的404源码
2020/12/16 HTML / CSS
大学四年的个人自我评价
2014/01/14 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
小学语文教学反思范文
2016/03/03 职场文书
NodeJs使用webpack打包项目的方法详解
2022/02/28 NodeJs