Используйте LIMIT для разбиения на страницы результатов в запросе MySQL

Я хочу получить мои результаты "страницу" за раз; Я хочу, чтобы номер страницы был параметром (в подготовленном выражении JDBC). Рассмотрим следующий фрагмент

SELECT * FROM thread t ORDER BY t.id LIMIT ((? - 1) * 20), 20

Так что в идеале это приведет к тому, что на странице 1 LIMIT 0, 20,

Когда я проверяю

SELECT * FROM thread t ORDER BY t.id LIMIT ((1 - 1) * 20), 20

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

ОШИБКА 1064 (42000): у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с '((1 - 1) * 20), 20' в строке 1

Что я делаю не так с моим LIMIT оговорка, а как это исправить?

3 ответа

Решение

MySQL требует числовые константы для этого синтаксиса LIMIT.

С http://dev.mysql.com/doc/refman/5.7/en/select.html:

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

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

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

Вычислить константу на стороне Java.

Это не может быть сделано.

Смотрите решение здесь: MySQL Math и COUNT(*) в LIMIT

Я бы порекомендовал использовать javascript или что-то еще для обработки первого параметра (т.е. смещения), например:limit 0,20 на первой странице и limit 21,20 на втором...

Например, если ваша первая страница имеет переменную get в URL-адресе www.example.com?page=1

offset = (page - 1)*20 ;
row_count = 20;
select * from table limit (offset, row_count);

Определить смещение для запроса.

Например

если вы хотите, чтобы page-1 (записи 1-10) смещение =0, предел =10; для страницы 2 (записи 11-20) смещение =20, предел =10; и используйте следующий запрос:

SELECT column FROM table LIMIT {someLimit} OFFSET {someOffset};

пример:

SELECT column FROM table
LIMIT 10 OFFSET 10;
Другие вопросы по тегам