MySQL 查询第n个最大记录

在本节中,我们将学习如何借助各种技术在数据库表中选择第 n 个最高记录。

通过使用MAX()MIN() 函数,我们可以很容易地获取数据库表中的最大(最高)或最小(最低)记录。但是假设我们要从表中获取第 n 高的记录(例如,从雇员表中获取第二贵的薪水)。在这种情况下,没有可用的功能可以快速找到它,这使得它变得复杂。

通过执行以下步骤,我们可以选择MySQL数据库表中的第 n 个最高记录:

1. 第一步是将所需列按升序排序,得到 n 最高的记录,也就是结果输出中的最后一条记录。请参阅以下查询:

SELECT * FROM table_name ORDER BY colm_name ASC LIMIT N;

2. 之后,我们需要对结果输出进行降序排序,得到第一条记录。

SELECT * FROM (  
SELECT * FROM table_name   
ORDER BY colm_name ASC LIMIT N) AS temp_table  
ORDER BY colm_name DESC LIMIT 1;  

上面的查询也可以通过使用限制结果输出中的行数的LIMIT子句来重写,如下所示:

SELECT  * FROM table_name ORDER BY colm_name DESC LIMIT n - 1, 1;  

此查询将返回应该是第 n 个最高记录的n-1 行之后的第一行。

示例

让我们通过一个示例来了解如何从表中获取第 n 个最高记录。首先,我们将使用以下查询创建一个Employee表:

CREATE TABLE Employee (id int, name varchar(40), salary int);  

接下来,使用以下查询插入记录:

INSERT INTO Employee VALUES   
(1, 'Mike', 3000),  
(2, 'John', 4000),  
(3, 'Shane', 3000),  
(4, 'Biden', 5000),  
(5, 'Bravo', 7000); 

执行SELECT语句验证记录:

假设我们想在Employee表中获得第二高的雇员(n = 2);我们可以使用以下语句:

mysql> SELECT name, salary FROM Employee ORDER BY salary DESC LIMIT 1, 1;  

我们将看到如下输出:

假设我们想在Employee表中得到一个雇员(n = 3)的第三高薪水;我们可以使用以下语句:

mysql> SELECT name, salary FROM Employee ORDER BY salary DESC LIMIT 2, 1;  

我们将看到如下输出:

使用子查询获取第 n 个最高记录

我们还可以借助子查询获得第 n 高的记录,子查询依赖于主查询并针对主查询返回的每条记录进行处理。这种技术很少使用,因为它的性能/执行速度很慢。

请参阅以下使用子查询返回第 n 个最高记录的查询:

SELECT name, salary FROM Employee AS emp1   
WHERE N-1 = (SELECT COUNT(DISTINCT salary) FROM Employee emp2   
WHERE emp2.salary > emp1.salary)  

请参阅下面的查询,该查询使用子查询从员工表中返回第二高的薪水:

SELECT name, salary FROM Employee AS emp1   
WHERE 2-1 = (SELECT COUNT(DISTINCT salary) FROM Employee AS emp2   
WHERE emp2.salary > emp1.salary);  

我们将得到上一个查询返回的相同输出:

热门文章

优秀文章