MySQL Pagination, используя Limit, получает дублирующиеся строки - PullRequest
1 голос
/ 01 ноября 2011

У меня есть таблица с 116 000 строк, и я хочу получить все эти строки, но в 3 отдельных запроса, используя:

  1. "SELECT * FROM table LIMIT 0, 50000"
  2. "SELECT * FROM таблицы LIMIT 1, 50000"
  3. "SELECT * FROM таблицы LIMIT 2, 50000"

Я пробовал это, но все запросы возвращают результат в 50 000 строк, даже если «LIMIT равен 10 50000», результат будет не тем, что я хочу.Я ожидаю только 16 000 строк для третьего запроса.

Как я могу это сделать?Является ли мое ожидание ОГРАНИЧЕНИЯ нумерации LIMIT неправильным?

Ответы [ 5 ]

5 голосов
/ 01 ноября 2011

Ваше ожидание того, как работает LIMIT, неверно. Первый параметр - это первая извлекаемая запись, а второй параметр - количество извлекаемых записей.

Например, если запрос имеет 800 результатов, и вы используете LIMIT 100, 300, вы получите от 100 до 400 строк, всего 300 строк.

Перейдите к http://dev.mysql.com/doc/refman/5.0/en/select.html и найдите «Предложение LIMIT», чтобы узнать больше о том, как работает LIMIT.

1 голос
/ 01 ноября 2011

Предложение Limit принимает один или два аргумента:

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

Так что вы можете сделать:

select * from table limit 0,50000;
select * from table limit 50001,50000;
select * from table limit 100001,50000;

Взгляните на эту ссылку

1 голос
/ 01 ноября 2011

Это LIMIT offset, rowcount. Ваш первый запрос выбирает 50 000 строк, начиная со строки 0. Второй запрос выбирает 50 000 строк, начиная со строки 2. Другими словами, вы выбираете 49 999 одинаковых строк, а затем одну другую.

Если вы хотите разделить 116 000 строк на 3 равные части, вам нужно будет сделать

SELECT ... LIMIT 0, 38666
SELECT ... LIMIT 38667, 38666
SELECT ... LIMIT 77333, 38668
1 голос
/ 01 ноября 2011

Первый аргумент LIMIT - это номер начальной записи, а не номер начальной страницы. Ваши лимиты в этом случае должны быть:

  1. "SELECT * FROM таблицы LIMIT 0, 50000" # 50 000 записей, начиная с 0-й записи
  2. «ВЫБОР * ИЗ ОГРАНИЧЕНИЯ таблицы 50000, 50000» # 50 000 записей, начиная с 50000-й записи
  3. "SELECT * FROM таблицы LIMIT 100000, 50000" # 50000 записей, начиная с 100000-й записи
0 голосов
/ 01 ноября 2011

Да, вы понимаете, что это неправильно.Вы должны сделать

SELECT * FROM table LIMIT 100000, 50000

.Синтаксис:

SELECT [..] LIMIT <count>

или

SELECT [..] LIMIT <offset>, <count>

.В то время как все зависит от количества выбранных строк.

...