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

作者:CodePhage 时间:2024-01-17 13:43:46 

假定业务:

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

创建数据库


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 |
+-------+--------+------------+--------+

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

来源:https://blog.csdn.net/Tinwares/article/details/117425956

标签:mysql,orderby
0
投稿

猜你喜欢

  • JavaScript实现简单随机点名器

    2024-04-10 16:18:39
  • PDO::prepare讲解

    2023-06-06 06:15:28
  • 利用Python还原方阵游戏详解

    2022-01-28 03:59:44
  • 《设计网事》前言

    2009-07-15 17:19:00
  • 深入讲解HTTPS中的加密算法

    2023-01-20 18:10:52
  • Python super()方法原理详解

    2023-06-19 18:28:30
  • 完美解决mysql启动后随即关闭的问题(ibdata1文件损坏导致)

    2024-01-12 14:43:03
  • Python自制一个PDF转PNG图片小工具

    2023-07-24 11:40:12
  • 超越质检员——看图购beta版的思考

    2009-04-15 12:11:00
  • 比较经典技术普及帖 以你刚才在淘宝上买了一件东西

    2022-01-19 06:59:15
  • Pytorch通过保存为ONNX模型转TensorRT5的实现

    2023-10-22 13:45:27
  • SQL Server中使用SQL语句实现把重复行数据合并为一行并用逗号分隔

    2024-01-18 03:06:54
  • ASP连接MySQL数据库代码示例2

    2010-03-08 14:26:00
  • python实现指定字符串补全空格的方法

    2023-06-22 21:57:40
  • 如何得到数据库中所有表名 表字段及字段中文描述

    2024-01-24 23:58:40
  • 封装 Python 时间处理库创建自己的TimeUtil类示例

    2023-01-15 00:45:56
  • Pycharm导入anaconda环境的教程图解

    2022-12-15 04:26:40
  • 在Python函数中输入任意数量参数的实例

    2022-07-09 04:58:08
  • 解决PyCharm中光标变粗的问题

    2022-10-24 15:47:32
  • 解决Vue不能检测数组或对象变动的问题

    2024-04-27 15:59:40
  • asp之家 网络编程 m.aspxhome.com