Форум сетевых администраторов Страницы (2): [1] 2 »
Показаны 17 сообщений на этой странице

Форум сетевых администраторов (http://netadmin.ws/forum/index.php)
- MySQL (http://netadmin.ws/forum/forumdisplay.php?forumid=40)
-- Постраничный вывод результатов (http://netadmin.ws/forum/showthread.php?threadid=11188)


Помещено Jovani 04-11-2005 в 18:33:

Постраничный вывод результатов

Как правильно сделать постраничный вывод результатов SQL-запроса, примерно такого:

code:

$sql = "SELECT field1, field2 
        FROM table
        WHERE field3 = 1";


Собственно, нужно узнать сколько строк вернется в результате.

Если перед ним, для подсчета возвращаемых строк, делаю запрос:

code:
$sql = "SELECT count(*) as total_rows
        FROM table
        WHERE field3 = 1";


... все получается, так как есть $total_rows

Как правильно обьеденить эти два запроса?


Помещено polo 04-11-2005 в 19:25:

вообщето это не нужно, запрос с подсчетом при правильном индексировании ресурсов почти не забирает.

__________________
Всегда есть решение.


Помещено Xel'[Naga] 05-11-2005 в 22:29:

А зачем делать 2 запроса?
Т.е. ты делаешь примерно так:
mysql_query($sql);
$counter = mysql_num_rows();
В переменной $counter будет кол-во выбранных строк.

__________________
Всего хорошего.


Помещено Jovani 06-11-2005 в 13:29:

quote:
Первоначальное сообщение от Xel'[Naga]
А зачем делать 2 запроса?

Тут я не знаю, сам хотел управиться с одним, но не получилось
В первом, вычисляю сколько всего страниц получим.
Например, при возврате 6000 строк, и 30 результатов на страницу, получим 6000/30=200 страниц.
Во втором SQL-запросе, уже можем вводить LIMIT для облегчения запроса.

К сожалению, я не программист PHP и SQL, специализируюсь на ASM-е, не знаю как это делается правильно.
Вот если бы кто дал "заготовку" ...


Помещено sVs 06-11-2005 в 14:24:

quote:
Первоначальное сообщение от Jovani
...Вот если бы кто дал "заготовку" ...
Задачу постраничного вывода данных из базы можно условно разбить на 2 части:

  1. отображение страницы с текущим номером и заданным числом записей;
  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">&lt;&lt</A> ';
        
$str.='<A href="'.$URL.($r_start-1).'">&lt;</A> ';
        }
    else 
$str.="&lt;&lt &lt; ";

    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).'">&gt;</A>';
        
$str.=' <A href="'.$URL.(intval($records/$inpage)-(1-$add)).'">&gt;&gt;</A>';
        }
    else 
$str.=" &gt; &gt;&gt";
    return(
$str);
}
?>

Как это в итоге выглядит - можно посмотреть тут

__________________
Всякое решение порождает новые проблемы...


Помещено Jovani 06-11-2005 в 14:38:

sVs дык ты привел только генерацию URL, с этим я справлюсь
Мне сами SQL запрос(ы) важны ...

Собственно, сделал тут + ЧПУ, но два запроса, как ни крутил ...


Помещено sVs 06-11-2005 в 14:53:

ну так и выбирай записи, как в том примере:
select ПОЛЯ from ТАБЛИЦА limit $r_start*$inpage,$inpage
// $r_start - номер текущей страницы
// $inpage - количество записей на странице
и будет выбрано не более $inpage записей, начиная с записи $r_start*$inpage
А номер текущей страницы удобнее передавать параметром через GET

А тот второй запрос, в котором определяется общее к-во записей - он, по большому счету, нужен только для определения количества страниц и относится к задаче отображения постраничной навигации, с которой ты и так справляешься ;-)

__________________
Всякое решение порождает новые проблемы...


Помещено Jovani 06-11-2005 в 15:46:

Ð_то так, но если в запрос ввести LIMIT, как узнать, сколько всего будет записей? Никак. С этого, все и началось ...

Пришел к выводу, что два запроса нужно по любому, а хотелось одним ...


Помещено Xrobak 06-11-2005 в 16:22:

если у тебя mysql верси выше 4.0, то почитай это, тут написано как делать с одним запросом:
_http://www.phpfaq.ru/paginator


Помещено sVs 06-11-2005 в 17:23:

да, можно и так, только для MySQL версии 4.0 или выше:
SELECT SQL_CALC_FOUND_ROWS ПОЛЯ FROM ТАБЛИЦА WHERE УСЛОВИЕ LIMIT m,n
SELECT FOUND_ROWS() - выдаст к-во строк из предыдущего запроса (как если бы там не было LIMIT)

__________________
Всякое решение порождает новые проблемы...


Помещено polo 06-11-2005 в 18:25:

Узнать кол-во результатов можно сделать только при помощи запроса или использовать left join чтобы сделать одним запросом - хоть это и не лучшее решение.

1. Запрос подсчета кол-ва строк. При подсчете индексированного поля расход ресурсов настолько незначителен что даже не стоит обращять внимание на это.
2. Запрос для извлечения результатов используя LIMIT x,y где x,y - вычисляются на базе номера текущей страницы, кол-ва желаемых записей на странице и кол-ва результатов.

Другое решение, правда не универсальное это использовать JavaScript для постраничного вывода.

__________________
Всегда есть решение.


Помещено Xel'[Naga] 07-11-2005 в 15:20:

quote:
Первоначальное сообщение от Jovani
Тут я не знаю, сам хотел управиться с одним, но не получилось
В первом, вычисляю сколько всего страниц получим.
Например, при возврате 6000 строк, и 30 результатов на страницу, получим 6000/30=200 страниц.
Во втором SQL-запросе, уже можем вводить LIMIT для облегчения запроса.

К сожалению, я не программист PHP и SQL, специализируюсь на ASM-е, не знаю как это делается правильно.
Вот если бы кто дал "заготовку" ...



Может проще сохранять переменную о кол-ве где-то отдельно?
Тут уже проще будет.

__________________
Всего хорошего.


Помещено polo 07-11-2005 в 20:32:

quote:
Может проще сохранять переменную о кол-ве где-то отдельно?
Хороший выход, но для этого должен быть предусмотрен механизм кэширования часто использованной информации, или это число должно быть взято с каким либо предыдущим запросом.

__________________
Всегда есть решение.


Помещено Jovani 08-11-2005 в 01:55:

Спасибо, думаю, что вопрос исчерпан.
Ð_аз делают по два запроса, значит будет два
Ну, а кешировать в моем случае, нет смысла, записи добавляются достаточно часто.


Помещено Xel'[Naga] 12-11-2005 в 18:46:

Столкнулся с аналогичной пробемой, только более сложной.
Вообщем попробуй:
SELECT COUNT(*) AS total_rows, field1, field2
FROM table
GROUP BY field1
WHERE field3 = 1";

По сути должно работать
Ещё раз убеждаюсь, мануалы рулят.
У меня выводится все записи с дополнительной колонкой total_rows которая во всех случаях равна кол-ву найденных записей.

__________________
Всего хорошего.


Формат времени GMT. Текущее время 18:54. Страницы (2): [1] 2 »
Показаны 17 сообщений на этой странице

Powered by: vBulletin Version 2.2.4
Copyright © Jelsoft Enterprises Limited 2000, 2001.