【问题标题】:MySQL: Select top n max values?MySQL:选择前 n 个最大值?
【发布时间】:2013-11-07 03:17:47
【问题描述】:

对于需要返回在特定列上具有最大值的前 N ​​行的查询,我真的很困惑。

例如,如果行 N-1, N, N + 1 具有相同的值。我必须返回just top Ntop N + 1 行吗?

【问题讨论】:

  • ORDER BY .. LIMIT,不是吗?如果没有,请发布示例数据、预期输出和有效的尝试(但导致不正确的结果)查询。
  • ORDER BY 只给我前 N 个?
  • ORDER BY 只是订单。 LIMIT 提供限制。同样,一些示例数据/结果将大有帮助(并避免或逆转投票)。
  • 谢谢,但我只是想问一下,我必须总是返回前 N 或者如果有一些行具有相同的值(示例),我需要全部返回。
  • Groupwise max,有一些变体;全部高效:mysql.rjweb.org/doc.php/groupwise_max

标签: mysql max


【解决方案1】:

如果你这样做:

select *
from t
order by value desc
limit N

您将获得前 N 行。

如果你这样做:

select *
from t join
     (select min(value) as cutoff
      from (select value
            from t
            order by value
            limit N
           ) tlim
    ) tlim
    on t.value >= tlim;

或者您可以更简单地表述为:

select *
from t join
     (select value
      from t
      order by value
      limit N
    ) tlim
    on t.value = tlim.value;

从概念上讲,以下是您想要做的,但它可能不适用于 MySQL:

select *
from t
where t.value >= ANY (select value from t order by value limit N)

【讨论】:

  • 所以对于“选择前 N 行具有最大值”的问题,我必须使用第一个或第二个。因为如果我只返回前 N 个,可能会丢失一些行。
【解决方案2】:

使用以下 SQL 查询。

SELECT salary FROM salesperson 
ORDER BY salary DESC
LIMIT 2,1

【讨论】:

  • 你必须多描述一点。我不认为这个问题的答案。
【解决方案3】:

您应该为此使用自联接。

  1. 首先找到特定列的前 (n) 个可能值
  2. 根据主键加入同一张表

例如在下面的示例表中

CREATE TABLE `employee` (
  `ID` INT(11)   AUTO_INCREMENT PRIMARY KEY,
  `NAME` VARCHAR(50) NOT NULL,
   `SALARY` INT(11) NOT NULL , 
    JOINING_DATE TIMESTAMP  
) ENGINE=MYISAM 

INSERT INTO  employee (NAME,salary,joining_date)    VALUES('JAMES',50000,'2010-02-02'),
('GARGI',60000,'2010-02-02'),('DAN',30000,'2010-02-02'),('JOHN',10000,'2010-02-02'),('MICHEL',70000,'2010-02-02'),
('STIEVE',50000,'2010-02-02'),('CALRK',20000,'2010-02-02'),('BINNY',50000,'2010-02-02'),('SMITH',40000,'2010-02-02'),
('ROBIN',60000,'2010-02-02'),('CRIS',80000,'2010-02-02');

通过上面的表格数据设置查询薪水排名前三的员工将是:

SELECT e1.* FROM 
(SELECT DISTINCT salary FROM Employee ORDER BY salary DESC LIMIT 3 ) S1
JOIN employee  e1 
ON e1.salary = s1.salary 
ORDER BY e1.salary DESC 

提示:-

如果您需要前 4 名,只需将 LIMIT 3 更改为 LIMIT 4

【讨论】:

  • 在您的示例查询中,您指的是具有不同案例 (S1/s1) 的同一个表。如the documentation 所述,这不起作用。但否则答案很好,谢谢。
  • 我当时在 WIndows 上测试过。感谢您的建议是的,我应该在两个地方都使用相同的案例 s1/S1
猜你喜欢
  • 2011-08-28
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 2021-09-28
  • 2013-01-25
  • 1970-01-01
相关资源
最近更新 更多