Как реализовать постраничный вывод данных из БД (PHP, MySQL) с сортировкой?

Собственно, сабж. Делаю некий сайт пока на локальной машине и столкнулся с проблемой постраничного вывода данных из базы. Сам вывод записей и создание ссылок на следующие страницы вопросов не вызвал, а когда дело дошло до сортировки начал "тупить".
Постраничный вывод все реализуют через SELCT * FROM table LIMIT ?i ?i, где ?i - сколько записей и с какой начинать. Но если делать сортировку через ORDER BY ..., то получится что я отсортирую только строки, попадающие под условия лимита, а провести ее надо для всей таблицы и только после этого выводить постранично. Может я что-то не понимаю и есть какой-то другой способ реализации (ну должен же быть). В голову пока ничего не лезет, на просторах сети тоже подобных тем не нашел. Направьте в нужное русло, заранее спасибо!
  • Вопрос задан
  • 2635 просмотров
Решения вопроса 2
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Но если делать сортировку через ORDER BY ..., то получится что я отсортирую только строки, попадающие под условия лимита, а провести ее надо для всей таблицы и только после этого выводить постранично.
Вы понимаете не правильно.
Сначала происходит order by всех строк в результирующей выборке.
Потом через limit определяется сколько и каких строк Вы получите от sql сервера.

Запрос
select id from table 
order by id desc
limit 10

вернет 10 самых больших 10 id из всей таблицы

Ну и мануал почитайте, там все описано в каком порядке применяется dev.mysql.com/doc/refman/5.7/en/select.html
Ответ написан
LenovoId
@LenovoId
svg, css,js
https://www.youtube.com/watch?v=W86QmL8E_rM , я не эксперт php но делал как у него , по поводу mysql а не mysqli не проблема
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
inik23
@inik23
типа разработчик
Думаю в данном случае единственное правильное решение при сортировке сбрасывать пагинацию на первую строку. Все фильтры так работают.
Ответ написан
Комментировать
@d-stream
Готовые решения - не подаю, но...
Гм... а разве лимит накладывается до order ???

Для надежности можно конечно вот так сделать:
select * from
(select * from table order by z) as ordered_table
limit x,y

только как мне кажется последовательность применения все-таки WHERE -> GROUP BY -> HAVING -> ORDER BY -> LIMIT
Ответ написан
Комментировать
Urvin
@Urvin
Но если делать сортировку через ORDER BY ..., то получится что я отсортирую только строки, попадающие под условия лимита

Не получится, сначала выполняется ORDER BY и затем от него отсекается LIMIT
Ответ написан
Комментировать
Может попробовать уже готовые варианты?
Например www.pagination.ru
А вообще гуглите в сторону -> pagination php
P.S. А если Ваше решение, то по идее, если мы сначала сохраним в переменную отсортированный массив, а потом будем его выводить, то он должен работать как надо.
Например:
$orderby = mysqli_query("SELECT * FROM `qq` ORDER BY `то по чем сотрируем`");
$page = $_GET['page'];
$i = 0;
while ($news = mysql_fetch_assoc($orderby)){
if ($i < 10*$page AND $i > 10*$page+10) {//10 можно в переменную, в которой будет количество записей на страницу.
echo $news;
}
$i++;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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