![]() |
Показаны 17 сообщений на этой странице |
Форум сетевых администраторов (http://netadmin.ws/forum/index.php)
- MySQL (http://netadmin.ws/forum/forumdisplay.php?forumid=40)
-- Постраничный вывод результатов (http://netadmin.ws/forum/showthread.php?threadid=11188)
Постраничный вывод результатов
Как правильно сделать постраничный вывод результатов SQL-запроса, примерно такого:
$sql = "SELECT field1, field2
FROM table
WHERE field3 = 1";
$sql = "SELECT count(*) as total_rows
FROM table
WHERE field3 = 1";
вообщето это не нужно, запрос с подсчетом при правильном индексировании ресурсов почти не забирает.
__________________
Всегда есть решение.
А зачем делать 2 запроса?
Т.е. ты делаешь примерно так:
mysql_query($sql);
$counter = mysql_num_rows();
В переменной $counter будет кол-во выбранных строк.
__________________
Всего хорошего.
quote:Тут я не знаю, сам хотел управиться с одним, но не получилось
Первоначальное сообщение от Xel'[Naga]
А зачем делать 2 запроса?

quote:Задачу постраничного вывода данных из базы можно условно разбить на 2 части:
Первоначальное сообщение от Jovani
...Вот если бы кто дал "заготовку" ...
<?
// функция формирования кода ссылки для постраничного вывода записей базы
// $records - общее число записей в таблице
// $r_start - номер текущей страницы
// $URL - базовый полный адресс ссылок перехода, заканчивающийся на '='
// $inpage - количество записей на странице
//
// Запрос: "select ПОЛЯ from ТАБЛИЦА limit ".($r_start*$inpage).",".$inpage"
//
function LeftRight($records,$r_start,$URL,$inpage) {
$str="";
if ($records<=$inpage) return;
if ($r_start!=0) {
$str.='<A href="'.$URL.'0"><<</A> ';
$str.='<A href="'.$URL.($r_start-1).'"><</A> ';
}
else $str.="<< < ";
if ($r_start==0) {$sstart=$r_start-0;$send=$r_start+10;}
if ($r_start==1) {$sstart=$r_start-1;$send=$r_start+9;}
if ($r_start==2) {$sstart=$r_start-2;$send=$r_start+8;}
if ($r_start==3) {$sstart=$r_start-3;$send=$r_start+7;}
if ($r_start==4) {$sstart=$r_start-4;$send=$r_start+6;}
if ($r_start>=5) {$sstart=$r_start-5;$send=$r_start+5;}
if ($send*$inpage>$records) $send=$records/$inpage;
if ($sstart<0) $sstart=0;
if ($records%$inpage==0) $add=0; else $add=1;
for ($i=$sstart;$i<$send;$i++) {
if ($i==$r_start) $str.=" <B>".($i+1)."</B> | ";
else $str.='<A href="'.$URL.($i).'"><U><B>'.($i+1).'</B></U></A> | ';
}
if ($r_start+(1-$add)<intval($records/$inpage)) {
$str.=' <A href="'.$URL.($r_start+1).'">></A>';
$str.=' <A href="'.$URL.(intval($records/$inpage)-(1-$add)).'">>></A>';
}
else $str.=" > >>";
return($str);
}
?>
__________________
Всякое решение порождает новые проблемы...
sVs дык ты привел только генерацию URL, с этим я справлюсь 
Мне сами SQL запрос(ы) важны ...
Собственно, сделал тут + ЧПУ, но два запроса, как ни крутил ...
ну так и выбирай записи, как в том примере:
select ПОЛЯ from ТАБЛИЦА limit $r_start*$inpage,$inpage
// $r_start - номер текущей страницы
// $inpage - количество записей на странице
и будет выбрано не более $inpage записей, начиная с записи $r_start*$inpage
А номер текущей страницы удобнее передавать параметром через GET
А тот второй запрос, в котором определяется общее к-во записей - он, по большому счету, нужен только для определения количества страниц и относится к задаче отображения постраничной навигации, с которой ты и так справляешься ;-)
__________________
Всякое решение порождает новые проблемы...
Ð_то так, но если в запрос ввести LIMIT, как узнать, сколько всего будет записей? Никак. С этого, все и началось ...
Пришел к выводу, что два запроса нужно по любому, а хотелось одним ...
если у тебя mysql верси выше 4.0, то почитай это, тут написано как делать с одним запросом:
_http://www.phpfaq.ru/paginator
да, можно и так, только для MySQL версии 4.0 или выше:
SELECT SQL_CALC_FOUND_ROWS ПОЛЯ FROM ТАБЛИЦА WHERE УСЛОВИЕ LIMIT m,n
SELECT FOUND_ROWS() - выдаст к-во строк из предыдущего запроса (как если бы там не было LIMIT)
__________________
Всякое решение порождает новые проблемы...
Узнать кол-во результатов можно сделать только при помощи запроса или использовать left join чтобы сделать одним запросом - хоть это и не лучшее решение.
1. Запрос подсчета кол-ва строк. При подсчете индексированного поля расход ресурсов настолько незначителен что даже не стоит обращять внимание на это.
2. Запрос для извлечения результатов используя LIMIT x,y где x,y - вычисляются на базе номера текущей страницы, кол-ва желаемых записей на странице и кол-ва результатов.
Другое решение, правда не универсальное это использовать JavaScript для постраничного вывода.
__________________
Всегда есть решение.
quote:
Первоначальное сообщение от Jovani
Тут я не знаю, сам хотел управиться с одним, но не получилось
В первом, вычисляю сколько всего страниц получим.
Например, при возврате 6000 строк, и 30 результатов на страницу, получим 6000/30=200 страниц.
Во втором SQL-запросе, уже можем вводить LIMIT для облегчения запроса.
К сожалению, я не программист PHP и SQL, специализируюсь на ASM-е, не знаю как это делается правильно.
Вот если бы кто дал "заготовку" ...
__________________
Всего хорошего.
quote:Хороший выход, но для этого должен быть предусмотрен механизм кэширования часто использованной информации, или это число должно быть взято с каким либо предыдущим запросом.
Может проще сохранять переменную о кол-ве где-то отдельно?
__________________
Всегда есть решение.
Спасибо, думаю, что вопрос исчерпан.
Ð_аз делают по два запроса, значит будет два 
Ну, а кешировать в моем случае, нет смысла, записи добавляются достаточно часто.
Столкнулся с аналогичной пробемой, только более сложной.
Вообщем попробуй:
SELECT COUNT(*) AS total_rows, field1, field2
FROM table
GROUP BY field1
WHERE field3 = 1";
По сути должно работать 
Ещё раз убеждаюсь, мануалы рулят.
У меня выводится все записи с дополнительной колонкой total_rows которая во всех случаях равна кол-ву найденных записей.
__________________
Всего хорошего.
Xel'[Naga] а какже в данном случае вычислить кол-во страниц и какие результаты выводить?
__________________
Всегда есть решение.
Тема конечно больная. Я немного поторопился. =)
Вообщем если горит один запрос то:
$sql = "SELECT field1, field2
FROM table
WHERE field3 = 1";
$res_sql = mysql_query($sql);
$count[total_rows] = mysql_num_rows($res_sql);
$count[pages] = intval($count[total_rows] / <кол-во записей на страницу> );
while($res = mysql_fetch_array($res_sql))
{
###
}
Вот и вся арифметика =)
__________________
Всего хорошего.
| Формат времени GMT. Текущее время 17:56. | Показаны 17 сообщений на этой странице |
Powered by: vBulletin Version 2.2.4
Copyright © Jelsoft Enterprises Limited 2000, 2001.