Биллинговая система Nodeny

Главная категория => Курилка => Тема начата: andromeda от 15 Марта 2013, 09:48:51



Название: Выбока из БД
Отправлено: andromeda от 15 Марта 2013, 09:48:51
Доброе утро.
Есть стороне написанный скрипт выборки из БД.
Сейчас выбирает так ID, ФИО, ул, №дома, и т.д.
и сохраняет это в файл. Помогите допилить так чтоб еще брал телефон, МАК, группу клиента. Что-то я своими силами не смог.
Код:
#!/usr/bin/perl

use DBI;

my $dbh = DBI->connect(
"DBI:mysql:host=localhost;database=bill",
"root","passwd",
{
PrintError=>0,
RaiseError=>0
}
);
$dbh or die(DBI::errstr);
$dbh->do("SET NAMES utf8");
my $str = $dbh->selectall_hashref("SELECT _adr_telefon,street,name_street v FROM p_street",'street');
$str or die(DBI::errstr);
my $sth = $dbh->prepare("SELECT id,fio FROM users ORDER BY id");
$sth->execute or die($dbh->errstr);
while(my $row=$sth->fetchrow_hashref){
my @user = ();
push(@user,$row->{id},$row->{fio});
my $adr = $dbh->selectall_hashref(
"SELECT dv.revision,df.field_alias,dv.field_value v FROM dopvalues dv ".
"INNER JOIN rev_users r ".
"INNER JOIN dopfields df ".
"ON r.rev=dv.revision AND r.id=dv.parent_id AND df.id=dv.dopfield_id ".
"WHERE r.template_num=2 AND r.id=$row->{id}",
'field_alias'
);
$adr && do{
push(@user,
$str->{$adr->{'_adr_telefon:p_street:street:name_street'}->{v}}->{v},
$adr->{_adr_house}->{v},
$adr->{_adr_block}->{v},
$adr->{_adr_room}->{v},
);
};
print join(';',@user).";\n";
}


Название: Re: Выбока из БД
Отправлено: goletsa от 15 Марта 2013, 12:10:17
Доброе утро.
Есть стороне написанный скрипт выборки из БД.
Сейчас выбирает так ID, ФИО, ул, №дома, и т.д.
и сохраняет это в файл. Помогите допилить так чтоб еще брал телефон, МАК, группу клиента. Что-то я своими силами не смог.
Код:
#!/usr/bin/perl

use DBI;

my $dbh = DBI->connect(
"DBI:mysql:host=localhost;database=bill",
"root","passwd",
{
PrintError=>0,
RaiseError=>0
}
);
$dbh or die(DBI::errstr);
$dbh->do("SET NAMES utf8");
my $str = $dbh->selectall_hashref("SELECT _adr_telefon,street,name_street v FROM p_street",'street');
$str or die(DBI::errstr);
my $sth = $dbh->prepare("SELECT id,fio FROM users ORDER BY id");
$sth->execute or die($dbh->errstr);
while(my $row=$sth->fetchrow_hashref){
my @user = ();
push(@user,$row->{id},$row->{fio});
my $adr = $dbh->selectall_hashref(
"SELECT dv.revision,df.field_alias,dv.field_value v FROM dopvalues dv ".
"INNER JOIN rev_users r ".
"INNER JOIN dopfields df ".
"ON r.rev=dv.revision AND r.id=dv.parent_id AND df.id=dv.dopfield_id ".
"WHERE r.template_num=2 AND r.id=$row->{id}",
'field_alias'
);
$adr && do{
push(@user,
$str->{$adr->{'_adr_telefon:p_street:street:name_street'}->{v}}->{v},
$adr->{_adr_house}->{v},
$adr->{_adr_block}->{v},
$adr->{_adr_room}->{v},
);
};
print join(';',@user).";\n";
}

Для группы.
Цитировать
my $sth = $dbh->prepare("SELECT id,fio,grp FROM users ORDER BY id");
Вообще очень красивое решение, у меня просто дикое количество SELECT когда решал такую задачу. Но там все в лоб, 1-2 запроса на 1 данные.


Название: Re: Выбока из БД
Отправлено: stix от 15 Марта 2013, 12:16:05
еще через union можно выбрать


Название: Re: Выбока из БД
Отправлено: 0xbad0c0d3 от 15 Марта 2013, 13:24:50
еще через union можно выбрать
Еще можно открыть MYD файл и распарсить оО Нахрена тут юнион? Тут уже и так практически все есть

2 andromeda:
Код:
my $str = $dbh->selectall_hashref("SELECT _adr_telefon,street,name_street v FROM p_street",'street');
Что за берд? ))) Этот вопрос, также, относится и к этому:
Код:
$str->{$adr->{'_adr_telefon:p_street:street:name_street'}->{v}}->{v},
По коду вижу, что ОРИГИНАЛ писал я, не помню, правда, когда...
Код:
#!/usr/bin/perl

use DBI;

my $dbh = DBI->connect(
"DBI:mysql:host=localhost;database=bill",
"root","passwd",
{
PrintError=>0,
RaiseError=>0
}
);
$dbh or die(DBI::errstr);
$dbh->do("SET NAMES utf8");
my $str = $dbh->selectall_hashref("SELECT street,name_street v FROM p_street",'street');
$str or die(DBI::errstr);
my $sth = $dbh->prepare(
        "SELECT u.id,u.fio,ifnull(g.grp_name,u.grp) grp FROM users u ".
        "LEFT JOIN user_grp g ON g.grp_id=u.grp ".
        "ORDER BY id"
);
$sth->execute or die($dbh->errstr);
while(my $row=$sth->fetchrow_hashref){
my @user = ();
push(@user,$row->{id},$row->{fio},$row->{grp_name});
my $dd = $dbh->selectall_hashref(
"SELECT dv.revision,df.field_alias,dv.field_value v FROM dopvalues dv ".
"INNER JOIN rev_users r ".
"INNER JOIN dopfields df ".
"ON r.rev=dv.revision AND r.id=dv.parent_id AND df.id=dv.dopfield_id ".
"WHERE r.template_num IN (1,2) AND r.id=$row->{id}",
'field_alias'
);
$dd && do{
push(@user,
$str->{$dd->{'p_street:street:name_street'}->{v}}->{v},
$dd->{_adr_house}->{v},
$dd->{_adr_block}->{v},
$dd->{_adr_room}->{v},
$dd->{_adr_telefon}->{v},
$dd->{_mac}->{v},
);
};
print join(';',@user).";\n";
}


Название: Re: Выбока из БД
Отправлено: andromeda от 15 Марта 2013, 14:25:23
Ну там и написано что код не мой. Взят с http ://forum.nodeny.com.ua/index.php?topic=1877.0
Чуть допилили под свои нужды.
Теперь что у меня не получается добавить полей в выборку, то есть я даже не представляю что сделать, вот и создал топик сюда.
Код:
my $sth = $dbh->prepare("SELECT id,fio,grp FROM users ORDER BY id")
это чудо добавил. Чуть попозже проверю.


Название: Re: Выбока из БД
Отправлено: andromeda от 15 Марта 2013, 14:27:01
Ну на счет этого
Цитировать
2 andromeda:
Код:
my $str = $dbh->selectall_hashref("SELECT _adr_telefon,street,name_street v FROM p_street",'street');
Что за берд? ))) Этот вопрос, также, относится и к этому:
Код:
$str->{$adr->{'_adr_telefon:p_street:street:name_street'}->{v}}->{v},
По коду вижу, что ОРИГИНАЛ писал я, не помню, правда, когда...
Я даже не знаю что имелось в виду, Что не так с кодом?


Название: Re: Выбока из БД
Отправлено: 0xbad0c0d3 от 15 Марта 2013, 14:33:58
это чудо добавил. Чуть попозже проверю.
Это я себе написал? Чтобы не забыть? )))
Имеется ввиду это:
Код:
#!/usr/bin/perl

use DBI;

my $dbh = DBI->connect(
"DBI:mysql:host=localhost;database=bill",
"root","passwd",
{
PrintError=>0,
RaiseError=>0
}
);
$dbh or die(DBI::errstr);
$dbh->do("SET NAMES utf8");
my $str = $dbh->selectall_hashref("SELECT street,name_street v FROM p_street",'street');
$str or die(DBI::errstr);
my $sth = $dbh->prepare(
        "SELECT u.id,u.fio,ifnull(g.grp_name,u.grp) grp FROM users u ".
        "LEFT JOIN user_grp g ON g.grp_id=u.grp ".
        "ORDER BY id"
);
$sth->execute or die($dbh->errstr);
while(my $row=$sth->fetchrow_hashref){
my @user = ();
push(@user,$row->{id},$row->{fio},$row->{grp_name});
my $dd = $dbh->selectall_hashref(
"SELECT dv.revision,df.field_alias,dv.field_value v FROM dopvalues dv ".
"INNER JOIN rev_users r ".
"INNER JOIN dopfields df ".
"ON r.rev=dv.revision AND r.id=dv.parent_id AND df.id=dv.dopfield_id ".
"WHERE r.template_num IN (1,2) AND r.id=$row->{id}",
'field_alias'
);
$dd && do{
push(@user,
$str->{$dd->{'p_street:street:name_street'}->{v}}->{v},
$dd->{_adr_house}->{v},
$dd->{_adr_block}->{v},
$dd->{_adr_room}->{v},
$dd->{_adr_telefon}->{v},
$dd->{_mac}->{v},
);
};
print join(';',@user).";\n";
}


Название: Re: Выбока из БД
Отправлено: 0xbad0c0d3 от 15 Марта 2013, 14:38:52
Ну на счет этого
Цитировать
2 andromeda:
Код:
my $str = $dbh->selectall_hashref("SELECT _adr_telefon,street,name_street v FROM p_street",'street');
Что за берд? ))) Этот вопрос, также, относится и к этому:
Код:
$str->{$adr->{'_adr_telefon:p_street:street:name_street'}->{v}}->{v},
По коду вижу, что ОРИГИНАЛ писал я, не помню, правда, когда...
Я даже не знаю что имелось в виду, Что не так с кодом?
Не так то, что "_adr_telefon" вставлено куда попало, в первое, отдаленно напоминающее истыннй смысл, место..
Вот откуда в таблице p_street должен взяться телефон абонента? oO и вот эта конструкция:
"_adr_telefon:p_street:street:name_street" аналогично


Название: Re: Выбока из БД
Отправлено: andromeda от 15 Марта 2013, 14:55:30
Все понял) Будемс ковырять дальше.
В перле 0 ваше.. та и вообще unix системы только начал изучать. Все методом проб и ошибок.


Название: Re: Выбока из БД
Отправлено: goletsa от 15 Марта 2013, 15:43:47
Ну на счет этого
Цитировать
2 andromeda:
Код:
my $str = $dbh->selectall_hashref("SELECT _adr_telefon,street,name_street v FROM p_street",'street');
Что за берд? ))) Этот вопрос, также, относится и к этому:
Код:
$str->{$adr->{'_adr_telefon:p_street:street:name_street'}->{v}}->{v},
По коду вижу, что ОРИГИНАЛ писал я, не помню, правда, когда...
Я даже не знаю что имелось в виду, Что не так с кодом?
Не так то, что "_adr_telefon" вставлено куда попало, в первое, отдаленно напоминающее истыннй смысл, место..
Вот откуда в таблице p_street должен взяться телефон абонента? oO и вот эта конструкция:
"_adr_telefon:p_street:street:name_street" аналогично
Будет работать если мак не в адресе хранится а в технических данных? А то чтото сомнение гложет.


Название: Re: Выбока из БД
Отправлено: 0xbad0c0d3 от 15 Марта 2013, 15:55:57
Код:
mysql> SELECT dv.revision,df.field_alias,dv.field_value v FROM dopvalues dv
    -> INNER JOIN rev_users r
    -> INNER JOIN dopfields df
    -> ON r.rev=dv.revision AND r.id=dv.parent_id AND df.id=dv.dopfield_id
    -> WHERE r.template_num IN (1,2) AND r.id=991;
+----------+-----------------------------+-------------------+
| revision | field_alias                 | v                 |
+----------+-----------------------------+-------------------+
|    67898 | _mac                        | 00:E0:30:93:00:AE |
|    67898 | _no_statpw                  | 1                 |
|    67898 | _port                       |                   |
|    67898 | _vlan                       |                   |
|    67898 | _speed_in                   | 0                 |
|    67898 | _speed_out                  | 0                 |
|    67898 | _open_ports                 | 1                 |
|    67112 | p_street:street:name_street | 1                 |
|    67112 | _adr_house                  | 43                |
|    67112 | _adr_block                  |                   |
|    67112 | _adr_front_door             |                   |
|    67112 | _adr_floor                  |                   |
|    67112 | _adr_room                   |                   |
|    67112 | _adr_telefon                |                   |
|    67112 | _adr_mobile                 | 093_______        |
|    67112 | _adr_comment                |                   |
+----------+-----------------------------+-------------------+
16 rows in set (0.57 sec)


Название: Re: Выбока из БД
Отправлено: goletsa от 15 Марта 2013, 17:31:27
Надо будет на вооружение взять. Как раз надо много данных перепарсить.
Хотя время выполнения в полсекунды... Насколько большая база?
Мой вариант за  15 секунд 5к записей обрабатывал.


Название: Re: Выбока из БД
Отправлено: 0xbad0c0d3 от 15 Марта 2013, 21:26:36
85214 записи


Название: Re: Выбока из БД
Отправлено: goletsa от 16 Марта 2013, 11:21:48
85214 записи
users? Или в таблице допданных?


Название: Re: Выбока из БД
Отправлено: 0xbad0c0d3 от 16 Марта 2013, 12:50:32
в таблице допданных, юзеров 3+к
P.S. В скрипте переделать один запрос и все, за ноль целых хрендесятых обработает туеву хучу ;)
Код:
$ time ./slow.pl >data_slow.dat

real 20m42.488s
user 0m1.333s
sys 0m0.133s

$ time ./fast.pl >data_fast.dat

real 0m1.029s
user 0m0.367s
sys 0m0.027s

$ diff data_slow.dat data_fast.dat

$ wc -l data_fast.dat
3193 data_fast.dat