Задавайте вопросы, мы ответим
Вы не зашли.
Помогите, пожалуйста, решить.
По заданию, не могу использовать LIMIT, нужно заменить на что-то по стандарту Mysql.
Задача: Вывести имя сотрудника, получающего третью по величине зарплату в организации .
таблица по сотрудникам (employee):
id - число, первичный ключ
department_id - число, внешний ключ на таблицу department
chief_id - число, внешний ключ на саму таблицу employee
name - строка
salary - число
Мое стандартное работающее решение с LIMIT было бы таким:
SELECT name, MAX(salary)
FROM employee
GROUP BY salary
ORDER BY salary DESC
LIMIT 2, 1;
Неактивен
Здравствуйте.
А в чем проблема с использованием limit?
Можно, конечно, не использовать limit вовсе - то есть вытащить все данные на клиенте и там уже взять нужный элемент, но зачем?
Неактивен
Такое задание от преподавателя , использовать только стандарт.
Неактивен
Хм, а какой стандарт имеется в виду?
Спросите у преподавателя, какой именно стандарт ему нужен. ansi или какой?
Или покажите содержимое
https://en.wikipedia.org/wiki/Select_(SQL)#Limiting_result_rows
этой ссылки ему - пусть скажет, какой метод его устроит. И чтобы в mysql работал.
Потому что решение из стандарта ansi 2008
Select *
from {table}
order by {unique_key}
OFFSET {begin_base_0} ROWS
FETCH NEXT {rows} ROWS ONLY
в mysql, судя по всему, не представлено.
Или же - как я говорил чуть выше - вытащить на клиент всех и на клиенте отобрать 3-ю по счету зп.
Но это так себе решение - ибо сотрудников может быть много.
Можно, конечно, еще извратиться и что-то такое изобразить (LIMIT нам использовать запрещено, да? ).
SELECT id from `employee` WHERE salary = (SELECT max(salary) FROM (SELECT max(salary) FROM salary where salary NOT IN (SELECT max(salary) FROM `employee`)));
но это если все зарплаты разные.
И обязательно расскажите пожалуйста результат разговора с преподатавателем, аж на интересно стало, какой запрос он от Вас ждёт и какой стандарт надо использовать.
Запрет на использование LIMIT, честно говоря, ни в ВУЗЕ ни в работе не встрел.
Неактивен
deadka, спасибо Вам)) Да, потом обязательно напишу, уже самой интересно! Как он сказал, имеется в виду стандарт Mysql, типа LIMIT - это конечно хорошо, но это не стандарт, а нужно уметь работать по стандарту, поэтому думайте. На следующей неделе узнаю ответ) На клиент тоже не для меня сейчас решение, да и зп там подразумевается, что могут быть одинаковые, так что непонятно.
Неактивен
Стандарт mysql? Попросите его ссылочку на "стандарт mysql" .
В mysql limit имеется - вот можно ткнуть его в официальную документацию
https://dev.mysql.com/doc/refman/8.0/en … ation.html
, официальная документация от производителя СУБД как бе.
На клиент и одинаковые зп - да, это все так себе варианты, но Вы выводИте на чистую воду этого преподавателя Вашего, требуйте ссылки, пруфы, объяснения про этот загадочный стандарт :-).
Удачи, обязательно отпишитесь, как выясните что же за такой коварный стандарт mysql он имеет в виду, с которым limit нельзя использовать.
Еще спросите - может быть он оконные функции имел в виду? Правда это некрасиво, они совсем недавно появились-то в mysql
(с версии 8.0 ЕМНИП)
https://www.mysqltutorial.org/mysql-win … -function/
SELECT
`name`,
`salary`,
NTH_VALUE(`name`, 2) OVER ( ORDER BY `salary` DESC ) second_highest_salary
FROM
`employee`;
Попробуйте этот вариант? Если у Вас mysql 8.0
P. S. Приведенный Вами вариант в начале поста с лимитом несколько некорректный (изучите https://sqlinfo.ru/articles/info/18.html),
Если зарплаты разные, то:
Неактивен
P. S. Кстати говоря всё же можно без лимита, уже просто из спортивного интереса.
В запросе используете вспомогательную колонку, которая выводит то, насколько эта зарплата велика относительно остальных и отсекаете все записи кроме той, у которой это значение равно 2 (у самого зажиточного сотрудника значение этой колонки будет 0, у самого бедного - соответственно самое крупное, в нашем случае 4)
Неактивен
to deadka,
count(distinct salary) -- зарплаты ведь могут быть не уникальны.
to Катерина94,
посмотрите https://sqlinfo.ru/articles/info/45.html
кроме уже указанных решений вам подойдут ещё 2-ой и 5-ый способ
Неактивен
vasya, спасибо за поправку, тут действительно нужен distinct count(salary) вместо count(*) в моём варианте.
5-й способ - тут преподаватель LIMIT порезал, а ты пользовательские переменные предлагаешь? :-)
Неактивен
Катерина94,
появились ли у вас новости от преподавателя?
и чтобы не флудить, решение 2-ым способом из https://sqlinfo.ru/articles/info/45.html :
Неактивен