Используйте 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;