Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > count () с лимитом


Автор: NLspieler 28.7.2009, 03:36
Пишу гостевую книгу. Точнее я ее уже полностью написал, но остался один не совсем решенный вопрос.

Дело в том, что есть одна функция, которая достаёт заданную страницу с сообщениями из базы данных.
В ней используется такой запрос:
Код

SELECT * FROM `$mes_table` ORDER BY `id` DESC $limit

//$limit хранит LIMIT, зависящий от номера страницы

Но тут мне понадобилась функция, которая вычисляет количество сообщений на заданной странице.
Не долго думая, я таким образом модернизировал этот запрос:

Код

SELECT count(*) FROM `$mes_table` ORDER BY `id` DESC $limit


Но этот запрос работает совсем не так, как я ожидал. Для первой (нулевой) страницы он возвращает число всех записей. Для последующих всегда возвращает ноль.


Решил я проблему так, использовал запрос:
Код

SELECT `id` FROM `$mes_table` ORDER BY `id` DESC $limit

а результат пропустил через функцию mysql_num_rows() 

Такое решение оказалось рабочим, но очень не красивым. Зачем доставать данные, которые не используются?!

Есть ли способ решения на уровне SQL, без использования php?



 



Автор: Wolf1994 28.7.2009, 07:49
Количество сообщений на странице равно параметру $limit. Для крайней страницы можно пересчитать все сообщения, разделить на лимит, округлить до целых, умножить на $limit и найти между полученным значением и количеством всех сообщений разность - это и будет ответом.

Автор: NLspieler 28.7.2009, 08:25
 smile 
Написал не сложную функцию, не отнимающую лишних ресурсов БД

Код

<?php

function count_of_page($page_num , $limit , $count)
{
    //$page_num   Номер страницы для проверки
    //$limit      Количество сообщений на 1 странице
    //$count      Количество всех сообщений в БД
    
    $num_of_last_page = ceil ( $count / $limit ) ; //Номер последней страницы
    if ($page_num > $num_of_last_page or $page_num < 1) return 0 ; 
    
    if ($page_num == $num_of_last_page)
    {
        $mes_on_last_page = $count % $limit ;
        if ($mes_on_last_page==0) $mes_on_last_page = $limit ;
        return $mes_on_last_page ;
    }
    return $limit ;
}
?>

Автор: Ипатьев 28.7.2009, 09:42
Цитата(NLspieler @  28.7.2009,  03:36 Найти цитируемый пост)
Но этот запрос работает совсем не так, как я ожидал.

Ну разумеется. Количество возвращаемых строк не превышает лимита.
И просто счастье, что этот способ не сработал, поскольку, как я понял, ты хотел выполнять столько запросов, сколько страниц в гостевой. 

Но непонятно, зачем вообще понадобилась такая функция. Зачем нужно знать количество сообений на других страницах?

Автор: NLspieler 29.7.2009, 07:07
Цитата(Ипатьев @  28.7.2009,  09:42 Найти цитируемый пост)
Но непонятно, зачем вообще понадобилась такая функция.


Если пользователь - админ, то тогда появляется кнопочка удаления сообщения возле сообщений.

Если на нее нажать, происходит переход к срипту удаления. Ему передаются номер удаляемого сообщения и номер страницы с, которой оно удаляется. После удаления, происходит подсчет сообщений на странице, с которой удалилось сообщения, и если их больше нет, то происходит редирект на предидущую страницу. А если сообщения еще остались, то тогда происходит редирект на эту же страницу.


Правда сейчас эта функция стала и правда не нужна, т.к. гораздо проще использовать функцию количества страниц. Если переданный номер страницы больше количества страниц, то редирект на предидущую (последнию)

 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)