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学习总结-基础架构概述
Apr 05 MySQL
MySQL 可扩展设计的基本原则
May 14 MySQL
MySQL中几种插入和批量语句实例详解
Sep 14 MySQL
浅谈MySql整型索引和字符串索引失效或隐式转换问题
Nov 20 MySQL
MYSQL优化之数据表碎片整理详解
Apr 03 MySQL
详细聊一聊mysql的树形结构存储以及查询
Apr 05 MySQL
MySQL视图概念以及相关应用
Apr 19 MySQL
解决Mysql报错 Table 'mysql.user' doesn't exist
May 06 MySQL
mysql中关键词exists的用法实例详解
Jun 10 MySQL
MySQL数据库如何查看表占用空间大小
Jun 10 MySQL
MySQL表字段数量限制及行大小限制详情
Jul 23 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
10个实用的PHP代码片段
2011/09/02 PHP
php检测useragent版本示例
2014/03/24 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
php获取Google机器人访问足迹的方法
2015/04/15 PHP
PHP json_encode() 函数详解及中文乱码问题
2015/11/05 PHP
Zend Framework缓存Cache用法简单实例
2016/03/19 PHP
PHP实现清除MySQL死连接的方法
2016/07/23 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
php 实现一个字符串加密解密的函数实例代码
2016/11/01 PHP
Discuz论坛密码与密保加密规则
2016/12/19 PHP
PHPMailer ThinkPHP实现自动发送邮件功能
2018/06/10 PHP
JS关键字变色实现思路及代码
2013/02/21 Javascript
JS JSON对象转为字符串的简单实现方法
2013/11/18 Javascript
jquery实现select选中行、列合计示例
2014/04/25 Javascript
jquery 显示*天*时*分*秒实现时间计时器
2014/05/07 Javascript
分享一个常用的javascript静态类
2014/12/31 Javascript
Prototype框架详解
2015/11/25 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
Vue如何从1.0迁移到2.0
2017/10/19 Javascript
webpack 4.0.0-beta.0版本新特性介绍
2018/02/10 Javascript
Vue插件打包与发布的方法示例
2018/08/20 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
2019/08/09 Javascript
JavaScript ES6 Class类实现原理详解
2020/05/08 Javascript
TensorFlow如何实现反向传播
2018/02/06 Python
Python3.4实现远程控制电脑开关机
2018/02/22 Python
详解python中@的用法
2019/03/27 Python
在keras中model.fit_generator()和model.fit()的区别说明
2020/06/17 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
新浪网技术部笔试题
2016/08/26 面试题
师范生教育见习总结
2015/06/23 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
CSS极坐标的实例代码
2021/06/03 HTML / CSS
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers