web-dev-qa-db-ja.com

MySQL:上位n個の最大値を選択しますか?

私は、partircular collumnで最大値を持つ上位N行を返す必要があるクエリについて本当に混乱しています。

たとえば、行N-1, N, N + 1の値が同じ場合。 just top Nまたはtop N + 1行を返す必要があります。

22
Hoa Vu

もしあなたがそうするなら:

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)
30
Gordon Linoff

次の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');

上記のテーブルデータを設定すると、給与が上位3位の従業員を検索するクエリは次のようになります。

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

2