MySQL ВЫБИРАЕТ значение перед MAX

#mysql #sql #select #max

#mysql #sql #выберите #max

Вопрос:

Как выбрать 1-е, 2-е или 3-е значение перед MAX?

обычно мы делаем это с помощью order by и limit

 SELECT * FROM table1
ORDER BY field1 DESC
LIMIT 2,1
  

но с моим текущим запросом я не знаю, как это сделать…

Пример таблицы

  ---- ------ ------ ------- 
| id | name | type | count |
 ---- ------ ------ ------- 
|  1 | a    |    1 |     2 |
|  2 | ab   |    1 |     3 |
|  3 | abc  |    1 |     1 |
|  4 | b    |    2 |     7 |
|  5 | ba   |    2 |     1 |
|  6 | cab  |    3 |     9 |
 ---- ------ ------ ------- 
  

Я беру имя для каждого типа с максимальным количеством с помощью этого запроса

 SELECT 
    `table1b`.`name`
FROM
    (SELECT 
        `table1a`.`type`, MAX(`table1a`.`count`) AS `Count`
    FROM
        `table1` AS `table1a`
    GROUP BY `table1a`.`type`) AS `table1a`
        INNER JOIN
    `table1` AS `table1b` ON (`table1b`.`type` = `table1a`.`type` AND `table1b`.`count` = `table1a`.`Count`)
  

и я хочу, чтобы к имени добавился еще один столбец со значением перед max (count)

таким образом, результат должен быть

  ------ ------------ 
| name | before_max |
 ------ ------------ 
| ab   |          2 | 
| b    |          1 |
| cab  |       NULL | 
 ------ ------------ 
  

Пожалуйста, спросите, если что-то непонятно 😉

Ответ №1:

В соответствии с заданной вами табличной (тестовой) структурой запрос должен быть следующим :

 select max_name.name,before_max.count
from 
(SELECT type,max(count) as max
FROM `test` 
group by type) as type_max
join
(select type,name,count
from test 
) as max_name on (type_max.type = max_name.type and count = type_max.max )

left join
(select type,count
from test as t1
where count != (select max(count) from test as t2 where t1.type = t2.type)
group by type
order by count desc) as before_max on(type_max.type = before_max .type)
  

Комментарии:

1. спасибо 🙂 это потрясающе, я не мог в этом разобраться, а также это дало мне подсказку, как создавать еще более сложные запросы 🙂