powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Чем заменить LIMIT?
12 сообщений из 12, страница 1 из 1
Чем заменить LIMIT?
    #39967961
kate1994-07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите, пожалуйста, решить.
По заданию, не могу использовать 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;
...
Рейтинг: 0 / 0
Чем заменить LIMIT?
    #39967969
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kate1994-07,

LIMIT не параметризуется, поэтому в задании есть логика.

Решить можно двумя способами:
- через переменные, см. FAQ: Нумерация строк и другие вопросы про использование переменных
- аналитическими/оконными функциями, если версия MySQL позволяет. Например, с помощью ROW_NUMBER()
...
Рейтинг: 0 / 0
Чем заменить LIMIT?
    #39967995
kate1994-07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, но разве это получится уместить в один запрос? Нужно сделать именно одним запросом.
...
Рейтинг: 0 / 0
Чем заменить LIMIT?
    #39967999
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kate1994-07
miksoft, но разве это получится уместить в один запрос? Нужно сделать именно одним запросом.
Ну да, запрос будет один. Но с подзапросом.
...
Рейтинг: 0 / 0
Чем заменить LIMIT?
    #39968003
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kate1994-07


SELECT name, MAX(salary)
FROM employee
GROUP BY salary
ORDER BY salary DESC
LIMIT 2, 1;

ваш запрос не имеет смысла
так делать нельзя, тем более в MySQL
...
Рейтинг: 0 / 0
Чем заменить LIMIT?
    #39968044
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
SELECT t1.name, t1.salary
FROM employee t1
JOIN employee t2 ON t1.salary < t2.salary OR (t1.salary = t2.salary AND t1.id > t2.id)
GROUP BY t1.name, t1.salary
HAVING COUNT(t2.id) = 2


Если поле salary уникально (имеется соотв. уникальный индекс), то OR (t1.salary = t2.salary AND t1.id > t2.id) из ON - убрать.

id - поле или выражение первичного или любого уникального индекса.
...
Рейтинг: 0 / 0
Чем заменить LIMIT?
    #39968076
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а я думаю нужно не стесняться смотреть на то, что выдает запрос
1) пишем базовый запрос
Код: sql
1.
2.
3.
SELECT id, name, salary
FROM employees
ORDER BY salary DESC;



2) выводим результаты в клиенте, выписываем результат на бумажке

3) после этого смотрим на результаты стандартного рабочего решения

4) правим стандартное рабочее решение

5) приступаем к выполнению задания
...
Рейтинг: 0 / 0
Чем заменить LIMIT?
    #39968085
MikkiMouse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kate1994-07,

Есть еще 1 способ, со звездочкой, так сказать (по крайней мере, когда я его первый раз увидел, он мне показался малость заумным).
Но рабочий вариант, почему бы и нет )

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT emp.id, emp.name, emp.salary
FROM employee emp
WHERE 2 = (                            -- Nth record: N - 1 = (...) 
    SELECT COUNT(emp2.id)
    FROM employee emp2
    WHERE emp2.salary > emp.salary
)



Хотя, по ходу у Akina в предыдущем сообщении почти то же самое, только в профиль )))
...
Рейтинг: 0 / 0
Чем заменить LIMIT?
    #39968447
kate1994-07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MikkiMouse, спасибо большое, работает!
Сама бы не справилась! И вариант Akina тоже работает, спасибо)
...
Рейтинг: 0 / 0
Чем заменить LIMIT?
    #39968448
kate1994-07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mini.weblab, потому что в GROUP BY не то, что в SELECT?
...
Рейтинг: 0 / 0
Чем заменить LIMIT?
    #39968477
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kate1994-07
mini.weblab, потому что в GROUP BY не то, что в SELECT?

Потому что в SELECT не то, что в GROUP BY

SELECT name, MAX(salary) ... GROUP BY name
имело бы смысл
...
Рейтинг: 0 / 0
Чем заменить LIMIT?
    #39968509
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kate1994-07
mini.weblab, потому что в GROUP BY не то, что в SELECT?


потому что нужно смотреть и понимать результаты, которые возвращает запрос
во-первых, для вашей задачи GROUP не нужен,
во-вторых, вы используете группировку неправильно
и, в-третьих, если вы все-таки решили использовать группировку, то у вас должна быть хорошая причина для этого
:-)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Чем заменить LIMIT?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]