获取MySQL表中的第二高值

lau*_*ent 24 mysql

我有一个员工和工资表,用这种方式定义:

"name" (type: VARCHAR)
"salary" (type: INTEGER)
Run Code Online (Sandbox Code Playgroud)

我可以使用什么查询来获得此表中第二高的薪水?

Daw*_*son 43

这是一个解释关系的人.

Name    Salary
Jim       6
Foo       5
Bar       5
Steve     4

SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees WHERE salary < (SELECT MAX(salary) FROM employees))

Result --> Bar 5, Foo 5
Run Code Online (Sandbox Code Playgroud)

编辑: 我拿了Manoj的第二篇文章,调整它,使它更具人性化.对我而言,n-1并不直观; 但是,使用我想要的值,2 = 2nd,3 = 3rd等.

/* looking for 2nd highest salary -- notice the '=2' */
SELECT name,salary FROM employees
WHERE salary = (SELECT DISTINCT(salary) FROM employees as e1
WHERE (SELECT COUNT(DISTINCT(salary))=2 FROM employees as e2
WHERE e1.salary <= e2.salary)) ORDER BY name

Result --> Bar 5, Foo 5
Run Code Online (Sandbox Code Playgroud)

  • SELECT姓名,薪水FROM员工WHERE薪水=(SELECT MAX(薪水)FROM员工WHERE薪水<(SELECT MAX(薪水)FROM员工WHERE薪水<(SELECT MAX(薪水)FROM员工))).这种技术只是将SELECT语句嵌套到您尝试查找数字的位置(第2,第3,第4高收入).如果我想找到第五个最高薪的员工和帐户的关系,我会额外增加3个SELECT MAX(薪水)FROM employees WHERE salary <... etc.到原始答案的代码. (4认同)

Mr.*_*r.M 42

第二高薪的直接答案

SELECT name, salary
FROM employees ORDER BY `employees`.`salary` DESC LIMIT 1 , 1
Run Code Online (Sandbox Code Playgroud)

另一个有趣的方案

SELECT salary 
FROM emp 
WHERE salary = (SELECT DISTINCT(salary) 
                FROM emp as e1 
                WHERE (n) = (SELECT COUNT(DISTINCT(salary)) 
                             FROM emp as e2 
                             WHERE e1.salary <= e2.salary))
Run Code Online (Sandbox Code Playgroud)

  • 因为第一个解决方案是最直接的解决方案,所以这个答案越来越高。请参见[SELECT上的MySQL文档](http://dev.mysql.com/doc/refman/5.0/en/select.html)中有关“偏移”的部分。“ LIMIT”后的第一个数字是使用逗号时的偏移量。偏移量为零索引。因此,此查询选择从第二高的一行开始。(尽管,这不考虑联系) (3认同)
  • 为什么这会被投票?那个SELECT语句只返回一个值:TOP Salary.问题是找到第二高薪. (2认同)

Sun*_*rma 13

似乎我迟到了回答这个问题.这个衬垫如何获得相同的输出?

SELECT DISTINCT salary FROM employees ORDER BY salary DESC LIMIT 1,1 ;
Run Code Online (Sandbox Code Playgroud)

样品小提琴:https://www.db-fiddle.com/f/v4gZUMFbuYorB27AH9yBKy/0

  • DISTINCT 并不多余。这是必需的,因为可能有两个相继的相似工资。 (5认同)
  • 我认为您才刚刚开始,请查看此样本提琴:https://www.db-fiddle.com/f/v4gZUMFbuYorB27AH9yBKy/0第二个查询“ without`DISTINCT`”返回错误的值。 (2认同)

Nic*_*ssu 9

create table svalue (
name varchar(5),
value int
) engine = myisam;

insert into svalue value ('aaa',30),('bbb',10),('ccc',30),('ddd',20);

select * from svalue where value = (
select value 
from svalue
group by value
order by  value desc limit 1,1)
Run Code Online (Sandbox Code Playgroud)


san*_*mar 5

至于第二次:

SELECT name, salary
    FROM employee 
    ORDER BY salary DESC
    LIMIT 1 , 1
Run Code Online (Sandbox Code Playgroud)

至于第三个:

SELECT name, salary
    FROM employee 
    ORDER BY salary DESC
    LIMIT 2 , 1
Run Code Online (Sandbox Code Playgroud)