Требуется получить определенное количество объектов, но с конца последовательности
Коллеги, допустим есть поле в таблице, которое содержит какую-то последовательность данных. Мне требуется получить какое-то определенное количество бОльших объектов, но отсортированных в порядке возрастания. Способ, который приходит мне в голову - это сначала отсортировать по убыванию, потом взять определенное количество объектов, а потом отсортировать по возрастанию. Как-то так:
SELECT * FROM
(SELECT * FROM table_name
ORDER BY field_name DESC
LIMIT 100)
ORDER BY field_name
Вопрос Это единственный оптимальный способ? Нельзя как-то сразу взять хвост последовательности, а не голову?
Ответы (2 шт):
В случае, когда вы хотите получить определенное количество более больших объектов, отсортированных по возрастанию в поле таблицы, можно использовать оператор "ORDER BY" с "DESC" (по убыванию) и "LIMIT" для ограничения количества выводимых записей.
Однако, если вы хотите получить хвост последовательности напрямую, без необходимости сортировать их по убыванию, вы можете использовать сортировку по возрастанию и пропустить некоторое количество строк с помощью оператора "OFFSET".
Вот пример, как это может выглядеть: SELECT * FROM table_name ORDER BY field_name ASC OFFSET (total_rows - N) LIMIT N
Где "total_rows" - общее количество записей в таблице, а "N" - количество объектов, которые вы хотите получить (хвост последовательности).
Обратите внимание, что использование оператора "OFFSET" может быть неэффективным для больших таблиц, так как база данных придется пропустить много строк перед получением нужных записей. В таких случаях рекомендуется использовать сортировку по убыванию и ограничение количества записей с помощью "LIMIT".
В зависимости от конкретных требований и объема данных, выбор оптимального подхода может различаться. Производительность запросов может также зависеть от индексов и структуры таблицы. Тестирование разных вариантов может помочь определить оптимальное решение в вашем конкретном случае.
Есть ещё параметр OFFSET, но, чтобы его задать на нужное место в конце выборки (число записей в таблице, минус то, что вы указываете в LIMIT), вы ведь должны знать точное число записей в таблице. Ну, или сделать подвыборку, чтобы его получить.
И ещё в доке пишут, что использование большого OFFSET не эффективно, потому что фактически движок переберёт все записи до указанной оффсетом:
The rows skipped by an
OFFSETclause still have to be computed inside the server; therefore a largeOFFSETmight be inefficient.
Так что получается, что ваш способ с повторной сортировкой, видимо, оптимальный.