«Обратный» лимит? - PullRequest
       26

«Обратный» лимит?

3 голосов
/ 26 сентября 2011

Я использую MySQL для хранения финансовых данных и использую данные для создания, помимо прочего, реестров всех транзакций для каждой учетной записи. По соображениям производительности - и чтобы пользователь не был перегружен гигантской таблицей - я разбил результаты на страницы.

Теперь, как часть реестра, я отображаю текущий баланс для учетной записи. Поэтому, если я отображаю 20 транзакций на страницу и отображаю вторую страницу, я использую данные следующим образом:

  • Транзакции 0 - 19: Игнорировать их - они более поздние, чем просматриваемая страница.
  • Транзакции 20 - 39: Выберите все из них - они будут отображены.
  • Транзакции 40 - ??: Суммируйте суммы по ним, чтобы текущий баланс был точным.

Это последний, который меня раздражает. Легко выбрать первые 40 транзакций с помощью предложения LIMIT, но есть ли что-то сопоставимое для всего , но для первых 40? Что-то вроде "LIMIT -40"?

Я знаю, что могу сделать это с COUNT и небольшой математикой, но фактический запрос немного уродлив (несколько JOIN и GROUP BY), поэтому я бы предпочел выдать его как можно меньше раз. И это кажется достаточно полезным для включения в SQL - и я просто не знаю об этом. Кто-нибудь еще?

Ответы [ 2 ]

5 голосов
/ 26 сентября 2011

Документация гласит:

Предложение LIMIT может использоваться для ограничения количества строк, возвращаемых оператором SELECT.LIMIT принимает один или два числовых аргумента, которые оба должны быть неотрицательными целочисленными константами, за следующими исключениями:

  • В подготовленных выражениях параметры LIMIT можно указать с помощью?маркеры-заполнители.

  • В хранимых программах параметры LIMIT могут быть определены с использованием целочисленных стандартных параметров или локальных переменных, начиная с MySQL 5.5.6.

С двумя аргументами первый аргумент задает смещение первой строки, которую нужно вернуть, а второй - максимальное количество строк, которые нужно вернуть.Смещение начальной строки равно 0 (не 1):

SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15

Чтобы извлечь все строки от определенного смещения до конца набора результатов, вы можете использовать некоторое большое число дляВторой параметрЭтот оператор извлекает все строки из 96-й строки до последней:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

В следующий раз, пожалуйста, используйте документацию в качестве первого порта вызова.

1 голос
/ 26 сентября 2011

Вы можете взломать его следующим образом:

select sel.*
from
(
SELECT @rownum:=@rownum+1 rownum, t.*
FROM (SELECT @rownum:=0) r, YourTableOrYourSubSelect t
) sel
where rownum > 40

Это похоже на то, что у Oracle есть rownum в MySQL.

...