MySQL:选择前n个最大值?

时间:2013-11-07 03:17:48

标签: mysql max

我真的很困惑这个查询需要返回在partircular collumn上具有最大值的前N行。

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

3 个答案:

答案 0 :(得分:29)

如果你这样做:

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)

答案 1 :(得分:2)

使用以下SQL查询。

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

答案 2 :(得分:2)

您应该使用自联接。

  1. 首先找到特定列的顶部(n)可能值
  2. 根据主键
  3. 将其与同一个表联接起来

    例如在下面的样本表

    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