 |
 |
Форум сетевых администраторов » Базы данных » MySQL » Постраничный вывод результатов
| Автор |
| Тема |
 |
|
 |
|
|
|
Участник
|
| Постраничный вывод результатов |
[сооб. #79299]
04-11-2005 18:33 |
|
Участник

Зарегистрирован: Dec 2001
Место проживания: дома
Публикаций: 239
Статус:  |
Как правильно сделать постраничный вывод результатов SQL-запроса, примерно такого:
code:
Собственно, нужно узнать сколько строк вернется в результате.
Если перед ним, для подсчета возвращаемых строк, делаю запрос:
code:
... все получается, так как есть $total_rows
Как правильно обьеденить эти два запроса?
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
04-11-2005 18:33 |
|
|
Администратор
|
| вообщето это не нужно, запрос с подсчетом... |
[сооб. #79301]
04-11-2005 19:25 |
|
Администратор


Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус:  |
вообщето это не нужно, запрос с подсчетом при правильном индексировании ресурсов почти не забирает.
__________________
Всегда есть решение.
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
04-11-2005 19:25 |
|
|
Участник
|
А зачем делать 2 запроса?
Т.е. ты делаешь примерно... |
[сооб. #79312]
05-11-2005 22:29 |
|
Участник

Зарегистрирован: Aug 2003
Место проживания: г. Зеленогорск
Публикаций: 76
Статус: ![Xel'[Naga] в оф-лайне](images/offline.gif) |
А зачем делать 2 запроса?
Т.е. ты делаешь примерно так:
mysql_query($sql);
$counter = mysql_num_rows();
В переменной $counter будет кол-во выбранных строк.
__________________
Всего хорошего.
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
05-11-2005 22:29 |
|
|
Участник
|
[QUOTE]Первоначальное сообщение от Xel'[Naga]
[B]А... |
[сооб. #79318]
06-11-2005 13:29 |
|
Участник

Зарегистрирован: Dec 2001
Место проживания: дома
Публикаций: 239
Статус:  |
quote: Первоначальное сообщение от Xel'[Naga]
А зачем делать 2 запроса?
Тут я не знаю, сам хотел управиться с одним, но не получилось 
В первом, вычисляю сколько всего страниц получим.
Например, при возврате 6000 строк, и 30 результатов на страницу, получим 6000/30=200 страниц.
Во втором SQL-запросе, уже можем вводить LIMIT для облегчения запроса.
К сожалению, я не программист PHP и SQL, специализируюсь на ASM-е, не знаю как это делается правильно.
Вот если бы кто дал "заготовку" ...
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
06-11-2005 13:29 |
|
|
Участник+
|
[QUOTE]Первоначальное сообщение от Jovani
...Вот... |
[сооб. #79322]
06-11-2005 14:24 |
|
Участник+


Зарегистрирован: Apr 2002
Место проживания: Россия, Пятигорск
Публикаций: 69
Статус:  |
quote: Первоначальное сообщение от Jovani
...Вот если бы кто дал "заготовку" ...
Задачу постраничного вывода данных из базы можно условно разбить на 2 части:
- отображение страницы с текущим номером и заданным числом записей;
- формирование навигационных ссылок для перехода на другие страницы.
для выбора нужных записей из базы удобно использовать в запросе ... LIMIT m,n
А для формирования навигации можно использовать например такую функцию:
PHP:
<?
// функция формирования кода ссылки для постраничного вывода записей базы
// $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);
}
?>
Как это в итоге выглядит - можно посмотреть тут
__________________
Всякое решение порождает новые проблемы...
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
06-11-2005 14:24 |
|
|
Участник
|
| sVs дык ты привел только генерацию URL, с... |
[сооб. #79324]
06-11-2005 14:38 |
|
|


Участник+
|
ну так и выбирай записи, как в том примере:
select... |
[сооб. #79326]
06-11-2005 14:53 |
|
Участник+


Зарегистрирован: Apr 2002
Место проживания: Россия, Пятигорск
Публикаций: 69
Статус:  |
ну так и выбирай записи, как в том примере:
select ПОЛЯ from ТАБЛИЦА limit $r_start*$inpage,$inpage
// $r_start - номер текущей страницы
// $inpage - количество записей на странице
и будет выбрано не более $inpage записей, начиная с записи $r_start*$inpage
А номер текущей страницы удобнее передавать параметром через GET
А тот второй запрос, в котором определяется общее к-во записей - он, по большому счету, нужен только для определения количества страниц и относится к задаче отображения постраничной навигации, с которой ты и так справляешься ;-)
__________________
Всякое решение порождает новые проблемы...
Сообщение было отредактировано sVs 06-11-2005 в 14:57
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
06-11-2005 14:53 |
|
|
Участник
|
| Ð_то так, но если в запрос ввести LIMIT, как узнать,... |
[сооб. #79328]
06-11-2005 15:46 |
|
Участник

Зарегистрирован: Dec 2001
Место проживания: дома
Публикаций: 239
Статус:  |
Ð_то так, но если в запрос ввести LIMIT, как узнать, сколько всего будет записей? Никак. С этого, все и началось ...
Пришел к выводу, что два запроса нужно по любому, а хотелось одним ...
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
06-11-2005 15:46 |
|
|
Участник+
|
| если у тебя mysql верси выше 4.0, то почитай это,... |
[сооб. #79330]
06-11-2005 16:22 |
|
Участник+


Зарегистрирован: Mar 2004
Место проживания: Житомир
Публикаций: 632
Статус:  |
если у тебя mysql верси выше 4.0, то почитай это, тут написано как делать с одним запросом:
_http://www.phpfaq.ru/paginator
Сообщение было отредактировано Xrobak 07-11-2005 в 15:36
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
06-11-2005 16:22 |
|
|
Участник+
|
| да, можно и так, только для MySQL версии 4.0 или... |
[сооб. #79331]
06-11-2005 17:23 |
|
Участник+


Зарегистрирован: Apr 2002
Место проживания: Россия, Пятигорск
Публикаций: 69
Статус:  |
да, можно и так, только для MySQL версии 4.0 или выше:
SELECT SQL_CALC_FOUND_ROWS ПОЛЯ FROM ТАБЛИЦА WHERE УСЛОВИЕ LIMIT m,n
SELECT FOUND_ROWS() - выдаст к-во строк из предыдущего запроса (как если бы там не было LIMIT)
__________________
Всякое решение порождает новые проблемы...
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
06-11-2005 17:23 |
|
|
Администратор
|
| Узнать кол-во результатов можно сделать только... |
[сооб. #79332]
06-11-2005 18:25 |
|
Администратор


Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус:  |
Узнать кол-во результатов можно сделать только при помощи запроса или использовать left join чтобы сделать одним запросом - хоть это и не лучшее решение.
1. Запрос подсчета кол-ва строк. При подсчете индексированного поля расход ресурсов настолько незначителен что даже не стоит обращять внимание на это.
2. Запрос для извлечения результатов используя LIMIT x,y где x,y - вычисляются на базе номера текущей страницы, кол-ва желаемых записей на странице и кол-ва результатов.
Другое решение, правда не универсальное это использовать JavaScript для постраничного вывода.
__________________
Всегда есть решение.
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
06-11-2005 18:25 |
|
|
Участник
|
[QUOTE]Первоначальное сообщение от Jovani
[B]Тут... |
[сооб. #79342]
07-11-2005 15:20 |
|
Участник

Зарегистрирован: Aug 2003
Место проживания: г. Зеленогорск
Публикаций: 76
Статус: ![Xel'[Naga] в оф-лайне](images/offline.gif) |
quote: Первоначальное сообщение от Jovani
Тут я не знаю, сам хотел управиться с одним, но не получилось 
В первом, вычисляю сколько всего страниц получим.
Например, при возврате 6000 строк, и 30 результатов на страницу, получим 6000/30=200 страниц.
Во втором SQL-запросе, уже можем вводить LIMIT для облегчения запроса.
К сожалению, я не программист PHP и SQL, специализируюсь на ASM-е, не знаю как это делается правильно.
Вот если бы кто дал "заготовку" ...
Может проще сохранять переменную о кол-ве где-то отдельно?
Тут уже проще будет.
__________________
Всего хорошего.
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
07-11-2005 15:20 |
|
|
Администратор
|
| [quote]Может проще сохранять переменную о кол-ве... |
[сооб. #79355]
07-11-2005 20:32 |
|
Администратор


Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус:  |
quote: Может проще сохранять переменную о кол-ве где-то отдельно?
Хороший выход, но для этого должен быть предусмотрен механизм кэширования часто использованной информации, или это число должно быть взято с каким либо предыдущим запросом.
__________________
Всегда есть решение.
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
07-11-2005 20:32 |
|
|
Участник
|
Спасибо, думаю, что вопрос исчерпан.
Ð_аз делают... |
[сооб. #79358]
08-11-2005 01:55 |
|
Участник

Зарегистрирован: Dec 2001
Место проживания: дома
Публикаций: 239
Статус:  |
Спасибо, думаю, что вопрос исчерпан.
Ð_аз делают по два запроса, значит будет два 
Ну, а кешировать в моем случае, нет смысла, записи добавляются достаточно часто.
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
08-11-2005 01:55 |
|
|
Участник
|
| Столкнулся с аналогичной пробемой, только... |
[сооб. #79449]
12-11-2005 18:46 |
|
Участник

Зарегистрирован: Aug 2003
Место проживания: г. Зеленогорск
Публикаций: 76
Статус: ![Xel'[Naga] в оф-лайне](images/offline.gif) |
Столкнулся с аналогичной пробемой, только более сложной.
Вообщем попробуй:
SELECT COUNT(*) AS total_rows, field1, field2
FROM table
GROUP BY field1
WHERE field3 = 1";
По сути должно работать 
Ещё раз убеждаюсь, мануалы рулят.
У меня выводится все записи с дополнительной колонкой total_rows которая во всех случаях равна кол-ву найденных записей.
__________________
Всего хорошего.
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
12-11-2005 18:46 |
|
|
|
Формат времени GMT. Текущее время 17:52.
|
Правила форума:
Вы не можете создавать новые темы.
Вы не можете отвечать на существующие темы.
Вы не можете прикреплять файлы.
Вы не можете редактировать свои сообщения. |
HTML теги выкл.
Спец. код вкл.
Смайлики вкл.
[IMG] тег выкл.
|
|
|
|
| |
Page generated in 0.72699809 seconds (99.18% PHP - 0.82% MySQL) with 26 queries.
|
 |