Биллинговая система Nodeny
29 Апреля 2024, 19:33:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Прекращена поддержка версии Nodeny 49
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]
  Печать  
Автор Тема: Выбока из БД  (Прочитано 4936 раз)
andromeda
Постоялец
***

Карма: 1
Offline Offline

Сообщений: 206


Просмотр профиля Email
« : 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 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 Offline

Сообщений: 1872


Nodeny Support Team

205539
Просмотр профиля
« Ответ #2 : 15 Марта 2013, 12:16:05 »

еще через union можно выбрать
Записан
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
*

Карма: 116
Offline 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
Постоялец
***

Карма: 1
Offline Offline

Сообщений: 206


Просмотр профиля Email
« Ответ #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
Постоялец
***

Карма: 1
Offline Offline

Сообщений: 206


Просмотр профиля Email
« Ответ #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 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 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
Постоялец
***

Карма: 1
Offline Offline

Сообщений: 206


Просмотр профиля Email
« Ответ #8 : 15 Марта 2013, 14:55:30 »

Все понял) Будемс ковырять дальше.
В перле 0 ваше.. та и вообще unix системы только начал изучать. Все методом проб и ошибок.
Записан
goletsa
NoDeny
Спец
*

Карма: 21
Offline 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 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 Offline

Сообщений: 973


Просмотр профиля
« Ответ #11 : 15 Марта 2013, 17:31:27 »

Надо будет на вооружение взять. Как раз надо много данных перепарсить.
Хотя время выполнения в полсекунды... Насколько большая база?
Мой вариант за  15 секунд 5к записей обрабатывал.
Записан
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
*

Карма: 116
Offline Offline

Сообщений: 1059



Просмотр профиля
« Ответ #12 : 15 Марта 2013, 21:26:36 »

85214 записи
Записан
goletsa
NoDeny
Спец
*

Карма: 21
Offline Offline

Сообщений: 973


Просмотр профиля
« Ответ #13 : 16 Марта 2013, 11:21:48 »

85214 записи
users? Или в таблице допданных?
Записан
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
*

Карма: 116
Offline 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 » Записан
Страниц: [1]
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.20 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!