Mysql Offset Бесконечные строки

Я хотел бы построить запрос, который отображает все результаты в таблице, но смещается на 5 с начала таблицы. Насколько я могу судить, MySQL LIMIT требует ограничения, а также смещения. Есть ли способ сделать это?

Ответ 1

Из Руководство по MySQL в LIMIT:

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

SELECT * FROM tbl LIMIT 95, 18446744073709551615;

Ответ 2

Как вы упомянули, LIMIT требуется, поэтому вам нужно использовать самый большой возможный предел, который составляет 18446744073709551615 (максимум без знака BIGINT)

SELECT * FROM somewhere LIMIT 18446744073709551610 OFFSET 5

Ответ 3

Как отмечалось в других ответах, MySQL предлагает использовать 18446744073709551615 как количество записей в лимите, но подумайте над этим: что бы вы сделали, если получили 18 446 744 073 709 551 615 записей? На самом деле, что бы вы сделали, если у вас было 1 000 000 000 записей?

Возможно, вам нужно больше одного миллиарда записей, но я хочу сказать, что существует определенный предел числа, которое вы хотите, и оно меньше 18 квинтиллионов. Ради стабильности, оптимизации и, возможно, удобства использования я бы предложил внести некоторые существенные ограничения на запрос. Это также уменьшит путаницу для тех, кто никогда не видел этого волшебного номера, и имеет дополнительную выгоду от сообщения, по крайней мере, количества записей, которые вы готовы обрабатывать сразу.

Если вы действительно должны получить все 18 квинтиллионных записей из своей базы данных, возможно, то, что вы действительно хотите, это захватить их с шагом в 100 миллионов и цикл в 184 миллиарда раз.

Ответ 4

Другой подход состоял бы в том, чтобы выбрать столбец с автоимбликами, а затем отфильтровать его с помощью HAVING.

SET @a := 0; 
select @a:[email protected] + 1 AS counter, table.* FROM table 
HAVING counter > 4

Но я, вероятно, придерживаюсь подхода с высоким лимитом.

Ответ 5

Только сегодня я читал о лучшем способе получения огромных объемов данных (более миллиона строк) из таблицы mysql. Один из способов, как предлагается, использовать LIMIT x,y, где x - это смещение, а y - последняя строка, которую вы хотите вернуть. Однако, как я узнал, это не самый эффективный способ сделать это. Если у вас есть столбец автоинкремента, вы можете легко использовать оператор SELECT с предложением WHERE, из которого вы хотите начать запись.

Например,   SELECT * FROM table_name WHERE id > x;

Кажется, что mysql получает все результаты, когда вы используете LIMIT, а затем показывает только записи, которые вписываются в смещение: не лучшее для производительности.

Источник: ответьте на этот вопрос Форумы MySQL. Просто примите во внимание, что вопрос составляет около 6 лет.

Ответ 6

Вы можете использовать оператор MySQL с LIMIT:

START TRANSACTION;
SET @my_offset = 5;
SET @rows = (SELECT COUNT(*) FROM my_table);
PREPARE statement FROM 'SELECT * FROM my_table LIMIT ? OFFSET ?';
EXECUTE statement USING @rows, @my_offset;
COMMIT;

Протестировано в MySQL 5.5.44. Таким образом, мы можем избежать ввода номера 18446744073709551615.

Примечание: транзакция гарантирует, что переменная @rows согласуется с таблицей, рассмотренной при выполнении инструкции.

Ответ 7

Я знаю, что это старый, но я не видел подобного ответа, поэтому это решение, которое я бы использовал.

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

SELECT COUNT(*) FROM table_name;

Затем я построил бы свой запрос, используя результат, который я получил от count, как мой лимит (так как это максимальное количество строк, которое может возвратиться в таблице). Что-то вроде:

SELECT * FROM table_name LIMIT count_result OFFSET desired_offset;

Или, возможно, что-то вроде:

SELECT * FROM table_name LIMIT desired_offset, count_result;

Конечно, при необходимости вы можете вычесть желаемое_выполнение из count_result, чтобы получить фактическое точное значение для подачи в качестве предела. Передача значения "18446744073709551610" просто не имеет смысла, если я могу фактически определить подходящий предел для предоставления.

Ответ 8

Используя этот другой question и объединив этот трюк с ответом Грега, вы можете использовать ~ 0 вместо максимального значения unsigned bigint:

SELECT * FROM tbl LIMIT ~0 OFFSET 95;

или

SELECT * FROM tbl LIMIT 95, ~0;

Ответ 9

WHERE .... AND id > <YOUROFFSET>

id может быть любым автоинкрементным или уникальным числовым столбцом, который у вас есть...