【问题标题】:How to use multiple order by in a sql query with limit keyword?如何在带有limit关键字的sql查询中使用多个order by?
【发布时间】:2023-03-05 19:04:01
【问题描述】:

我想通过首先将结果集限制为 n 个最高薪水,然后将结果集反转并将其限制为 1,从而获得表中第 n 个最高薪水。

我使用了这个导致错误的查询:-

select *
  from salaries
 where emp_no=(select * from salaries order by salary desc limit 2) order by salary asc limit 1;    

错误表明子查询返回多行。

【问题讨论】:

标签: mysql sql


【解决方案1】:

如果你想要第二高的值,你可以使用:

SELECT *
FROM salaries
ORDER BY salary DESC
LIMIT 1,1;

db<>fiddle demo

【讨论】:

  • 我赞成,因为这在功能上符合 OP 的要求,并且是最佳解决方案(并且是该​​解决方案的第一个答案)。它可能应该解释在支持offsets 的任何数据库中,使用具有两种排序的子查询不是最佳解决方案。
  • 完全同意并支持您的评论!我的解决方案使用子查询完成任务,只是因为我还想说明使用子查询的正确方法。如有疑问,请始终让您的解决方案执行尽可能少的查询。
【解决方案2】:

这是一种方法:

SELECT s.* FROM 
(SELECT * FROM `salaries` ORDER BY salary DESC LIMIT 2) s
 ORDER BY s.salary ASC LIMIT 1;

切勿使用SELECT *,请参阅http://www.parseerror.com/blog/select-*-is-evil

【讨论】:

  • 这一点也不丑
  • @lukasz-szozda 在下面我赞成的答案是一个更优雅的解决方案。我更想使他的查询按要求工作。我的假设是使用子选择(学习子选择等)还有其他一些原因,这就是我保留它并且只是正确实现它的原因。我认为不必要的查询是丑陋的,并专注于效率。对不起,如果我的措辞冒犯了。
  • 可能,他们做不同的事情
【解决方案3】:
select * from salaries 
order by salary 
desc limit 1 offset 4;

https://www.db-fiddle.com/f/2itHSFs2enyNpJ3MK6Nxcz/0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2014-10-08
    • 1970-01-01
    • 2019-05-09
    • 2023-03-21
    • 2017-02-06
    • 1970-01-01
    相关资源
    最近更新 更多