Mysql select top n max значения

Как вы можете выбрать верхние значения n max из таблицы?

Для таблицы, подобной этой:

column1  column2
   1       foo
   2       foo
   3       foo
   4       foo
   5       bar
   6       bar
   7       bar
   8       bar

При n = 2 результат должен быть:

3    
4    
7    
8    

В приведенном ниже подходе выбирается только максимальное значение для каждой группы.

SELECT max(column1) FROM table GROUP BY column2

Возврат:

4
8

Ответы

Ответ 1

При n = 2 вы могли

SELECT max(column1) m 
FROM table t
GROUP BY column2
UNION
SELECT max(column1) m
FROM table t
WHERE column1 NOT IN (SELECT max(column1) 
                      WHERE column2 = t.column2)

для любого n вы можете использовать подходы, описанные здесь, чтобы имитировать ранг над разделом.

EDIT: Фактически эта статья даст вам именно то, что вам нужно.

В основном это что-то вроде этого

SELECT t.*
FROM
   (SELECT grouper,
          (SELECT val 
           FROM table li
           WHERE li.grouper = dlo.grouper
           ORDER BY
                 li.grouper, li.val DESC
           LIMIT 2,1) AS mid
   FROM 
      (
      SELECT DISTINCT grouper
      FROM table
      ) dlo 
   ) lo, table t
WHERE t.grouper = lo.grouper
      AND t.val > lo.mid

Замените grouper именем столбца, который вы хотите сгруппировать, и val с именем столбца, в котором хранятся значения.

Чтобы выяснить, как именно он функционирует, пошаговый шаг от самого внутреннего запроса и запускать их.

Кроме того, есть небольшое упрощение - подзапрос, который находит mid, может возвращать NULL, если определенная категория не имеет достаточных значений, поэтому COALESCE должен иметь такую ​​константу, которая имела бы смысл при сравнении (в вашем case это будет MIN домена val, в статье это MAX).

EDIT2: Я забыл упомянуть, что именно LIMIT 2,1 определяет n (LIMIT n, 1).

Ответ 2

Если вы используете mySQl, почему бы вам не использовать функциональность LIMIT? Сортируйте записи в порядке убывания и ограничьте верхнюю часть i.e.:

SELECT yourColumnName FROM yourTableName 
ORDER BY Id desc 
LIMIT 0,3