Задать вопрос
@MdaUZH

Правильно SQL запрос для пагинации?

Здравствуйте.

Делаю пагинацию, все шло хорошо пока не уперся в SQL запрос для вывода...

Не хотелось бы делать 2 sql запроса, 1 для самой пагинации ( узнать общее кол-во элементов ), а другой для лимитирования записей, и встал вопрос. как его правильно построить?

Пока запрос выглядит так:
SELECT * FROM table WHERE name LIKE 'banny%';
Но как лимитировать вывод, посредством самого php ?
или все же сделать ещё 1 запрос примерно такой:
SELECT * FROM table WHERE name LIKE 'banny%'; LIMIT 40,60

40 - например на странице по 20 записей, а эта 3 страница
60 - соответственно тоже. потому что начать с 40 записи и показать 20

Я думаю будет более логично как-то обиграть это на самом PHP не прибегая к лишнему запросу SQL

Все верно?
  • Вопрос задан
  • 3803 просмотра
Подписаться 2 Оценить 1 комментарий
Решения вопроса 1
@synapse_people
> Я думаю будет более логично как-то обиграть это на самом PHP не прибегая к лишнему запросу SQL
Лучше наоборот :)
Получить количество строк в таблице, где name начинается с banny как столбец rows_count.
SELECT COUNT(table.ID) AS rows_count FROM table WHERE name LIKE 'banny%';
Где ID - имя Primary Key.
SELECT * FROM table WHERE name LIKE 'banny%' LIMIT 40,60;
Получить строки с 40 по 60.
Просто прикиньте, если у вас будет 1 млн строк в таблице, вы их все будете тащить из БД в память пхп? Она не резиновая....
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Melkij
@Melkij
PostgreSQL DBA
Для mysql есть такая штука FOUND_ROWS() dev.mysql.com/doc/refman/5.7/en/information-functi...
Заявлена именно для подобных целей. При этом не работает оптимизация по лимиту, запрос всегда будет выполняться полностью, но обычно это лучше, чем выполнять отдельный count.

Возможно, вам подойдёт другой вариант: не выяснять вообще, сколько страниц доступно. Запрашивать не лимит 20, а лимит 21. Если вернулась 21 строка - выводите первые 20 и кнопку "показать ещё". Меньше 21 - только результат, это последняя страница.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы