Perl MySQL - как вернуть идентификатор последней строки таблицы, не просматривая всю таблицу? - PullRequest
0 голосов
/ 03 ноября 2010
my $sth = $dbh->prepare("SELECT id 
                           FROM user 
                          WHERE group == '1' 
                       ORDER BY id DESC 
                          LIMIT 1");

Я пытался получить идентификатор последней строки в таблице, не читая всю таблицу.

Я уже получаю доступ через:

my $sth = $dbh->prepare("SELECT name,
                                group 
                           FROM user 
                          WHERE group == '1' 
                          LIMIT $from, $thismany");
$sth->execute();
while(my ($name,$group) = $sth->fetchrow_array()) {

...и настройте небольшой запрос нумерации страниц, как вы можете видеть.

Но я пытаюсь выяснить, как определить, когда я нахожусь в последних (<= 500) строках, чтобы я мог отключить свои следующие 500" ссылка на сайт.Все остальное работает нормально.Я разобрался, как отключить ссылку «предыдущие 500», когда на первых 500 страницах все сам! </p>

Я думал, что установлю «переключатель» в цикле while, так что если ($ id = $ last_id) Я могу установить "переключатели" var.

Как:

if ($id = $last_id) {
$lastpage = 1; #the switch
}

Так что я могу отключить следующую ссылку 500, если ($ lastpage == 1).Я действительно новичок в этом и продолжаю зацикливаться на подобных вещах.

Спасибо за любую помощь.

Ответы [ 5 ]

4 голосов
/ 03 ноября 2010

Попробуйте взять дополнительный ряд и посмотреть, сколько строк вы действительно получили. Примерно так:

my @results = ( );
my $total   = 0;
my $sth     = $dbh->prepare(qq{
        SELECT name, group 
        FROM user 
        WHERE group = ?  
        LIMIT ?, ?
});
$sth->execute(1, $from, $thismany + 1);
while(my ($name, $group) = $sth->fetchrow_array()) {
        push(@results, [$name, $group]); # Or something more interesting.
        ++$total;
}
$sth->finish();  

my $has_next = 0;
if($total == $thismany + 1) {
    pop(@results);
    $has_next = 1;
}

И кстати, пожалуйста, используйте заполнители в всех вашего SQL, интерполяция чревата опасностью.

3 голосов
/ 03 ноября 2010

Всегда запрашивать еще одну строку, чем вы собираетесь показывать, как подсказывает mu, слишком короткий, это хороший способ.

Но если вы хотите использовать другой предложенный подход - выполнить два отдельных запросаMySQL, один для получения желаемых строк и один для получения общего количества, если не было предельного предложения, обеспечивает простой способ сделать это, комбинируя как можно большую часть работы:

SELECT SQL_CALC_FOUND_ROWS name, group FROM user WHERE group = '1' LIMIT ..., ...;

then:

SELECT FOUND_ROWS();

Спецификатор SQL_CALC_FOUND_ROWS изменяет то, что возвращает следующий FOUND_ROWS (), не требуя от вас выполнения отдельного SELECT COUNT(*) from user WHERE group = '1' запроса.

2 голосов
/ 03 ноября 2010

SELECT COUNT(*) from tablename даст вам количество строк, поэтому, если вы будете вести текущий подсчет того, сколько строк вы уже прочитали, вы узнаете, когда окажетесь на последней странице результатов.

Вы можете сгенерировать этот запрос с помощью (не проверено; в данный момент удалено от хорошей рабочей станции):

my $sth = $dbh->prepare("select COUNT(*) FROM user WHERE group == '1'");
my @data = $sth->fetchrow_array;
my $count = $data->[0];

(PS. Вы должны знать о проблемах внедрения SQL - , см. Здесь , почему.)

0 голосов
/ 03 ноября 2010

Хотя ваше первоначальное предложение SELECT id FROM table WHERE ... ORDER BY id DESC LIMIT 1 должно сработать для поиска идентификатора с наибольшим соответствием, стандартный способ сделать это - SELECT max(id) FROM table WHERE ...

0 голосов
/ 03 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...