Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Количество записей в базе


Автор: AlexanderI 13.2.2006, 18:34
Каким образом можно узнать количество записей в базе после запроса ?
Я делаю это так, а есть ли какой-нибудь альтернативный, простой способ ?

Код

$dbh = DBI->connect("DBI:mysql:database=$db;host=$host","$user","$password");

my $kol7 = $dbh->prepare("SELECT * FROM cat WHERE active=1");
$kol7->execute();
$kolvo=0;
while (my $klz = $kol7->fetchrow_hashref()) { #4
$kolvo++;
                                           } #/4
$kol7->finish();

print "всего записей $kolvo";

Автор: korob2001 13.2.2006, 20:41
http://forum.vingrad.ru/index.php?showtopic=77672

Автор: BlackLFL 13.2.2006, 21:31
Более правильно писать так
Код

select count(*) from table

Цитата

Начиная с некоторой версии (см. документацию) MySQL кэширует количество строк в таблице в метаданных для таблицы. Поэтому для count(*), при отсутствии УСЛОВИЯ на выборку, базе вообще не надо лезть в таблицу - значение возвращается мгновенно.

http://sql.ru/forum/actualthread.aspx?tid=261568

Автор: AlexanderI 13.2.2006, 21:48
А на Perl как это будет выглядеть ? Там все примеры на PHP.

Автор: korob2001 13.2.2006, 22:02
Там все примеры на SQL. В Perl запросы так же строятся на SQL, т.е. вместо такого запроса:
Код

SELECT * FROM cat WHERE active=1

Далаешь такой:
Код

SELECT count(*) FROM cat WHERE active=1

Автор: AlexanderI 13.2.2006, 22:15
Мне непонятно какая переменная будет храть эту цифру ? Как её вывести на экран ?

Код

my $log3 = $dbh->prepare("SELECT count(*) FROM cat_3gp WHERE (dobavil='$usersetlogin_id')");
$log3->execute();

???

$log3->finish();
$dbh->disconnect();

Автор: korob2001 13.2.2006, 22:20
Код

$dbh = DBI->connect(....);
$sth = $dbh->prepare("SELECT count(*) FROM cat WHERE active=1");
$sth->execute();
my($count) = $sth->fetchrow_array();
$sth->finish();
$dbh->disconnect();
print "Всего активно $count полей.";

Автор: BlackLFL 13.2.2006, 22:29
korob2001, есть специальный метод selectrow_array, который объединяет prepare, execute, fetchrow

Код

my $count = $dbh->selectrow_array("SELECT count(*) FROM cat WHERE active=1");
print "Записей $count";

Автор: korob2001 13.2.2006, 22:43
Да я не спорю, просто у человека было так написано, я так же и написал. Тебе так же нужно переменную захватить в скобки, что бы создать списковой контекст, иначе получишь общее кол-во элементов возвращённого массива, т.е. 1

Автор: BlackLFL 13.2.2006, 22:45
korob2001, я получю значение, возращенное count(*)
Добавлено @ 22:50
т.к. count(*) возращает всего одно значение, соответственно, мне не нужен списковый контекст

Автор: korob2001 13.2.2006, 22:59
Цитата

т.к. count(*) возращает всего одно значение, соответственно, мне не нужен списковый контекст

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

Автор: Kannabismus 15.2.2006, 00:33
Для подсчета суммарного кол-ва возможных строк в запросе с лимитом можно использовать:
Код

my $page_rows=$dbh->selectall_arrayref("SELECT SQL_CALC_FOUND_ROWS id,name,email FROM table LIMIT 0,30");
my $total_rows=$dbh->selectrow_array("SELECT FOUND_ROWS()");


Автор: rcdimon 15.2.2006, 11:31
Гы. Летом я занимался написанием подрограммы для работы с БД. Что бы было легко работать и можно было быстро менять запрос не меняя программу. И вот что у меня получилось. Не без помощи форумцев.

Код

sub mysql_request {
    my $sql = shift;
    my @row;
    my $sth = $dbh->prepare($sql);
    $sth->execute;

    if  (($sql =~ m/^select/i) || ($sql =~ m/^show/i)){
        while (my $ref = $sth->fetchrow_hashref()) {
       push @row, $ref;
        }

     $sth->finish();
     return \@row;
    }
}


Пользоваться этой подпрограммой одно УДОВОЛЬСТВИЕ!

Код

my $sql = "UPDATE " . $prefix . "_users 
                SET 
                    email = '$email',
                    name = '$name',
                    second_name = '$second_name',
                    birthday = '$birthday',
                    icq = $icq,
                    url = '$url'
                WHERE login = '$login'";

# В переменную $sql загоняем текст запроса


Дальнейшие действия зависят от того какой у нас был запрос. Если это просто вставка или модификация информации, то исполняем запрос так

Код

mysql_request ( $sql );
# Запрос выполнен


Если это запрос SELECT то выполняется так

Код

my $ref = mysql_request ( $sql );


Все. Ответ базы данных находится в хешах. А что бы добраться до них нам надо разыменовать $ref

Если у вас такой запрос, что в ответ база выдаст только одну строку, то удобнее пользоваться такой конструкцией

Код

        my $hash = @{$ref}[0];
                   
                  print $hash->{'id'}; # Вся красота заключается в том, что тут надо указывать имя столбца! И не париться :)



А если в ответ SQL сервер выдаст много строк, то вынимать надо так

Код

    foreach my $hash(@{$ref}) {
                  print $hash->{'id'};
         }



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

Автор: BlackLFL 15.2.2006, 13:31
а смысл использовать аж два "интерфейса" подряд, если можно обойтись одним?

Автор: rcdimon 15.2.2006, 14:12
smile

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