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"; }
|
|
|
Записан
|
|
|
|
goletsa
NoDeny
Спец
Карма: 21
Offline
Сообщений: 973
|
|
« Ответ #1 : 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 данные.
|
|
|
Записан
|
|
|
|
stix
NoDeny
Спец
Карма: 72
Offline
Сообщений: 1872
Nodeny Support Team
|
|
« Ответ #2 : 15 Марта 2013, 12:16:05 » |
|
еще через union можно выбрать
|
|
|
Записан
|
|
|
|
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
Карма: 116
Offline
Сообщений: 1059
|
|
« Ответ #3 : 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"; }
|
|
|
Записан
|
|
|
|
andromeda
|
|
« Ответ #4 : 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") это чудо добавил. Чуть попозже проверю.
|
|
|
Записан
|
|
|
|
andromeda
|
|
« Ответ #5 : 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}, По коду вижу, что ОРИГИНАЛ писал я, не помню, правда, когда... Я даже не знаю что имелось в виду, Что не так с кодом?
|
|
|
Записан
|
|
|
|
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
Карма: 116
Offline
Сообщений: 1059
|
|
« Ответ #6 : 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"; }
|
|
|
Записан
|
|
|
|
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
Карма: 116
Offline
Сообщений: 1059
|
|
« Ответ #7 : 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" аналогично
|
|
|
Записан
|
|
|
|
andromeda
|
|
« Ответ #8 : 15 Марта 2013, 14:55:30 » |
|
Все понял) Будемс ковырять дальше. В перле 0 ваше.. та и вообще unix системы только начал изучать. Все методом проб и ошибок.
|
|
|
Записан
|
|
|
|
goletsa
NoDeny
Спец
Карма: 21
Offline
Сообщений: 973
|
|
« Ответ #9 : 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" аналогично Будет работать если мак не в адресе хранится а в технических данных? А то чтото сомнение гложет.
|
|
|
Записан
|
|
|
|
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
Карма: 116
Offline
Сообщений: 1059
|
|
« Ответ #10 : 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)
|
|
|
Записан
|
|
|
|
goletsa
NoDeny
Спец
Карма: 21
Offline
Сообщений: 973
|
|
« Ответ #11 : 15 Марта 2013, 17:31:27 » |
|
Надо будет на вооружение взять. Как раз надо много данных перепарсить. Хотя время выполнения в полсекунды... Насколько большая база? Мой вариант за 15 секунд 5к записей обрабатывал.
|
|
|
Записан
|
|
|
|
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
Карма: 116
Offline
Сообщений: 1059
|
|
« Ответ #12 : 15 Марта 2013, 21:26:36 » |
|
85214 записи
|
|
|
Записан
|
|
|
|
goletsa
NoDeny
Спец
Карма: 21
Offline
Сообщений: 973
|
|
« Ответ #13 : 16 Марта 2013, 11:21:48 » |
|
85214 записи
users? Или в таблице допданных?
|
|
|
Записан
|
|
|
|
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
Карма: 116
Offline
Сообщений: 1059
|
|
« Ответ #14 : 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
|
|
« Последнее редактирование: 16 Марта 2013, 13:35:34 от 0xbad0c0d3 »
|
Записан
|
|
|
|
|