Когда я выполняю подготовленное заявление:
select SQL_CALC_FOUND_ROWS * from entries where ( START_DATE >= ? ) limit 300, 400
где START_DATE
имеет тип datetime
, Я получаю те же результаты, как если бы я бегу
select SQL_CALC_FOUND_ROWS * from entries where ( START_DATE >= ? ) limit 0, 400
Это означает, что мне показывают 400 результатов, а не 100 в первом запросе! Это почему?
Дополнительная информация:
я использую SQL_CALC_FOUND_ROWS
потому что тогда я выполняю запрос select FOUND_ROWS()
потому что мне нужно общее количество результатов, чтобы применить функцию разбивки на страницы, чтобы показывать 100 записей на странице. Один запрос, подобный приведенному выше, возвращает около 35 000 результатов (350 страниц).
Это не верно для других запросов в той же таблице. Например, запрос:
select SQL_CALC_FOUND_ROWS * from entries where ( NATIONALITY = ? ) limit 100, 200
успешно возвращает только 100 результатов. Это верно и для других столбцов. Только один из типа datetime
Кажется, есть проблема.
Мое мнение — вы смешиваете вещи в своем уме и неправильно поняли идею синтаксиса LIMIT.
Согласно документации:
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
потому что, как заметил @zerkms в комментариях:
LIMIT [OFFSET, ] NUMBER
это означает, что в вашем случае:
limit 300, 400
должен вернуть не более 400 строк после 300 🙂
и если вам интересно, почему
select SQL_CALC_FOUND_ROWS * from entries where ( NATIONALITY = ? ) limit 100, 200
успешно возвращает только 100 результатов.
мое единственное предположение, что ваш результат SQL без какого-либо LIMIT содержит только 200 строк (where ( NATIONALITY = ? )
)
Таким образом, нет никакой магии, но от вашего вопроса, как будто вы ожидаете, что LIMIT 100,200
значит для вас «вернуть мне строки между строкой 100 и строкой 200 из результата» — но это не то, как работает LIMIT
Других решений пока нет …