Как правило, вы хотите ..... LIMIT 50 OFFSET 0
для первого, затем LIMIT 50 OFFSET 50
для следующего до LIMIT 50 OFFSET a_number_as_big_or_bigger_than_the_number_of_rows
, в этом случае будет возвращено 0 строк.
Возможно, рассмотрите следующее, когда вводится дополнительная контрольная таблица, котораяможет сделать вещь гибкой и довольно простой: -
/* Just in case the tables exist */
DROP TABLE IF EXISTS mainTable;
DROP TABLE IF EXISTS iterationControl;
/* The table that will be progressively interrogated */
CREATE TABLE IF NOT EXISTS mainTable(aColumn INTEGER PRIMARY KEY);
/* The control table, could perhaps be TEMP table*/
CREATE TABLE IF NOT EXISTS iterationControl (chunkSize INTEGER, chunkStart INTEGER);
DELETE FROM iterationControl; /* Just in case, clear any rows */
INSERT INTO iterationControl VALUES(50,0,0); /* initialise the iteration table */
/* reset the chunk size for less out for this example only */
UPDATE iterationControl SET chunkSize = 5;
/* reset to the start (not needed here but as an example of how to)*/
UPDATE iterationControl SET chunkStart = 0;
/* Load some data purely included for testing purposes */
WITH RECURSIVE cte1(val) AS (SELECT 1 UNION ALL SELECT val+1 FROM cte1 LIMIT 10000)
INSERT INTO mainTable SELECT val FROM cte1;
/**START OF TESTING**/
/* First grab */
SELECT * FROM mainTable LIMIT (SELECT chunkSize FROM iterationControl) OFFSET (SELECT chunkStart FROM iterationControl);
/* Post run update*/
UPDATE iterationControl SET chunkStart = chunkStart + chunkSize;
/* 2nd grab */
SELECT * FROM mainTable LIMIT (SELECT chunkSize FROM iterationControl) OFFSET (SELECT chunkStart FROM iterationControl);
/* Post run update modified to skip till past the end ONLY FOR EASE OF DEMO */
UPDATE iterationControl SET chunkStart = chunkStart + chunkSize + 100000;
/* 3rd grab (mimic last) */
SELECT * FROM mainTable LIMIT (SELECT chunkSize FROM iterationControl) OFFSET (SELECT chunkStart FROM iterationControl);
/* Reset iteration Control to start from the begining*/
UPDATE iterationControl SET chunkStart = 0;
/* First of a new set of grabs */
SELECT * FROM mainTable LIMIT (SELECT chunkSize FROM iterationControl) OFFSET (SELECT chunkStart FROM iterationControl);
UPDATE iterationControl SET chunkStart = chunkStart + chunkSize;
/* change size of data part way through from 5 to 13 rows per grab */
UPDATE iterationControl SET chunkSize = 13;
/* 2nd grab now at 13 per grab */
SELECT * FROM mainTable LIMIT (SELECT chunkSize FROM iterationControl) OFFSET (SELECT chunkStart FROM iterationControl);
/* no change to post run even though different grab size */
UPDATE iterationControl SET chunkStart = chunkStart + chunkSize;
/* 3rd grab (just to show that post update worked correctly) */
SELECT * FROM mainTable LIMIT (SELECT chunkSize FROM iterationControl) OFFSET (SELECT chunkStart FROM iterationControl);
UPDATE iterationControl SET chunkStart = chunkStart + chunkSize;
/* clean up the database as I do not want these tables hanging around */
DROP TABLE IF EXISTS mainTable;
DROP TABLE IF EXISTS iterationControl;
Результаты
Результатами из вышеупомянутого являются
1.Самый первый захват (5 строк в соответствии с контролем)
2.2-й захват (следующие 5)
3.Последний захват (без строк после конца (в данном случае мимо))
4.После сброса для запуска (сначала захватите снова)
5.После «на лету» измените размер захвата / патрона (с 5 на 13)
6.Еще один пример из 13, просто для подтверждения того же поста, что обновление корректно работает