Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Количество записей в базе, Как узнать по быстрому ? 
:(
    Опции темы
AlexanderI
Дата 13.2.2006, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 2
Всего: 3



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

Код

$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";

--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
korob2001
Дата 13.2.2006, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61





--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
BlackLFL
Дата 13.2.2006, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 15.9.2005
Где: Москва

Репутация: 8
Всего: 12



Более правильно писать так
Код

select count(*) from table

Цитата

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

sql.ru - Подсчитывание количеста записей в таблице MySQL

PM WWW   Вверх
AlexanderI
Дата 13.2.2006, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 2
Всего: 3



А на Perl как это будет выглядеть ? Там все примеры на PHP.
--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
korob2001
Дата 13.2.2006, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



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

SELECT * FROM cat WHERE active=1

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

SELECT count(*) FROM cat WHERE active=1



--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
AlexanderI
Дата 13.2.2006, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 2
Всего: 3



Мне непонятно какая переменная будет храть эту цифру ? Как её вывести на экран ?

Код

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

???

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

--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
korob2001
Дата 13.2.2006, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Код

$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 полей.";



--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
BlackLFL
Дата 13.2.2006, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 15.9.2005
Где: Москва

Репутация: 8
Всего: 12



korob2001, есть специальный метод selectrow_array, который объединяет prepare, execute, fetchrow

Код

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


Это сообщение отредактировал(а) BlackLFL - 13.2.2006, 22:30
PM WWW   Вверх
korob2001
Дата 13.2.2006, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



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


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
BlackLFL
Дата 13.2.2006, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 15.9.2005
Где: Москва

Репутация: 8
Всего: 12



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

Это сообщение отредактировал(а) BlackLFL - 13.2.2006, 22:48
PM WWW   Вверх
korob2001
Дата 13.2.2006, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Цитата

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

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

Это сообщение отредактировал(а) korob2001 - 13.2.2006, 23:01


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Kannabismus
Дата 15.2.2006, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Тим Тоуди



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.11.2005

Репутация: 1
Всего: 2



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

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()");


PM   Вверх
rcdimon
Дата 15.2.2006, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: 1
Всего: 2



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

Код

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

Это сообщение отредактировал(а) rcdimon - 15.2.2006, 11:34
PM MAIL ICQ   Вверх
BlackLFL
Дата 15.2.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 15.9.2005
Где: Москва

Репутация: 8
Всего: 12



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

Это сообщение отредактировал(а) BlackLFL - 16.2.2006, 18:42
PM WWW   Вверх
rcdimon
Дата 15.2.2006, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: 1
Всего: 2



smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0855 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.