web-dev-qa-db-fra.com

MySQL: Sélectionnez les n premières valeurs maximales?

Je suis vraiment confus à propos de la requête selon laquelle il faut retourner les N premières lignes ayant les plus grandes valeurs sur la colonne partirculaire.

Par exemple, si les lignes N-1, N, N + 1 ont les mêmes valeurs. Dois-je retourner just top N ou top N + 1 lignes.

22
Hoa Vu

Si tu fais:

select *
from t
order by value desc
limit N

Vous obtiendrez les N premières lignes.

Si tu fais:

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;

Ou vous pourriez exprimer cela un peu plus simplement comme:

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

Ce qui suit est conceptuellement ce que vous voulez faire, mais cela peut ne pas fonctionner dans MySQL:

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

Utilisez la requête SQL suivante.

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

Vous devez utiliser l'auto-jointure pour cela.

  1. trouver d'abord les (n) premières valeurs possibles pour une colonne perticulaire
  2. le rejoindre avec la même table en fonction de la clé primaire

Pour Par exemple. sur le tableau ci-dessous

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

Avec les données de table ci-dessus configurées Requête pour trouver les employés ayant les 3 meilleurs salaires serait:

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 

CONSEIL: -

Si vous avez besoin du top 4, changez simplement LIMIT 3 à LIMIT 4

2