The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Массив значений при выборке из базы"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Массив значений при выборке из базы"  +/
Сообщение от SubGun (ok) on 08-Июл-09, 13:54 
Используя DBI и вот такой скрипт
for ($i = 1; $i <= 254; $i++) {
    for ($j = 0; $j <= 1; $j++) {
my $ipaddr = "192.168.13$j.$i";
my $dbh = DBI->connect($db_host,$db_user,$db_pass);
my $sth = $dbh->prepare(qq{SELECT bytes FROM $tbl1 WHERE ip='$ipaddr'});
$sth->execute();
(@result) = $sth->fetchrow_array();
                                }
                                }

я получаю выбоку из базы значений поля. После помещения их массив @result, мне необходимо просуммировать эти значения(сумма элементов массива), а так же, в ином случае, упорядочивать по возрастанию. Но как это сделать не знаю. Подскажите, пожалуйста.
Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Массив значений при выборке из базы"  +/
Сообщение от jd (??) on 08-Июл-09, 15:49 
1. Всё это можно (и лучше) сделать прямо в запросе.
2. Если вы не знаете, как упорядочить массив или найти сумму элементов и не знаете даже, как найти в интернете описание этих базовых процедур, которые есть абсолютно в любом учебнике по программированию (не говоря уже о встроенных конкретно в perl средствах), то зачем вы этим вообще занимаетесь?

Я хочу сказать, в этом нет ничего обидного или типа того: я не умею играть на скрипке и не вижу ничего зазорного в том, что меня не пустят на сцену консерватории. Просто найдите кого-нибудь, кто решит вам вашу небольшую задачу.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Массив значений при выборке из базы"  +/
Сообщение от SubGun (ok) on 09-Июл-09, 10:37 
Типа такого?
1. for ($i = 1; $i <= 254; $i++) {
2.     for ($j = 0; $j <= 1; $j++) {
3. my $summary = 0;
4. my $ipaddr = "192.168.13$j.$i";
5. my $dbh = DBI->connect($db_host,$db_user,$db_pass);
6. my $sth = $dbh->prepare(qq{SELECT bytes,time FROM $tbl1 WHERE ip='$ipaddr'});
7. $sth->execute();
8. while (my ($squid_bytes, $squid_time) = $sth->fetchrow_array()) {
9. print "$ipaddr - $squid_bytes - $squid_time\n";
10. $summary = $summary + $squid_bytes;
11.                                                                 }
12. $sth->finish();
13. $dbh->disconnect();
14. print "For IP $ipaddr summary bytes is $summary";
15.                                }
16.                                }

Все равно неверно работает. Честно говоря, в такие момент меня бесит этот убогий perl.
9-я строка отрабатывает отлично, 10-я только в первый раз работает, а в остальное время выдает нулевое значение. 14-я строка, вместо того, чтобы отрабатывать после каждого IP, выводит значение лишь один раз(зато неоднократно), в конце программы. Хрень какая-то.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Массив значений при выборке из базы"  +/
Сообщение от angra (ok) on 09-Июл-09, 15:17 
>Честно говоря, в такие момент меня бесит этот убогий perl.

Всегда смешно, когда не очень умные люди свою бездарность и невежество пытаются оправдать ругая инструмент. Деточка, perl один из самых мощных ЯП, сомневаюсь, что ты когда-либо осилишь хотя бы 10% его возможностей.

Кодер, догадавшийся вставить connect и prepare внутрь цикла, с моей точки зрения безнадежен. Если нет возможности нанять программиста и это твоя побочная задача, то просто сформулируй ее полностью словами с примером данных в базе и желаемого вывода, а мы уже дадим тебе готовый скрипт.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Массив значений при выборке из базы"  +/
Сообщение от DarkHost (??) on 10-Июл-09, 08:29 
>Всегда смешно, когда не очень умные люди свою бездарность и невежество пытаются
>оправдать ругая инструмент. Деточка, perl один из самых мощных ЯП, сомневаюсь,
>что ты когда-либо осилишь хотя бы 10% его возможностей.

А ты не сомневайся :) Языки программирования мне даются очень легко.

>Кодер, догадавшийся вставить connect и prepare внутрь цикла, с моей точки зрения
>безнадежен. Если нет возможности нанять программиста и это твоя побочная задача,
>то просто сформулируй ее полностью словами с примером данных в базе
>и желаемого вывода, а мы уже дадим тебе готовый скрипт.

С коннектом я действительно напартачил. Однако без prepare внутри цикла-никак, поскольку мне нужно выполнять изменяющийся по циклу запрос к базе. Если в двух словах, мне необходимо:
1. Выбрать из базы числовые значения поля по IP, а потом просуммировать эти значения.
2. Выбрать из базы числовые значения поля по IP, а потом отсортировать их по возрастанию.
Со вторым заданием сложнее, поскольку я не знаю верхнюю границу массива.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Массив значений при выборке из базы"  +/
Сообщение от Andrey (??) on 10-Июл-09, 08:50 
>1. Выбрать из базы числовые значения поля по IP, а потом просуммировать
>эти значения.

select sum(...) from ...

>2. Выбрать из базы числовые значения поля по IP, а потом отсортировать
>их по возрастанию.

select ... from ... order by ...

http://www.google.com/search?hl=en&client=firefox-a&rls=org....

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "Массив значений при выборке из базы"  +/
Сообщение от SubGun (ok) on 10-Июл-09, 11:31 
Как говорят у нас на районе: "оригато годзаймас"
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "Массив значений при выборке из базы"  +/
Сообщение от angra (ok) on 10-Июл-09, 11:44 
>А ты не сомневайся :) Языки программирования мне даются очень легко.

Я вижу как они тебе даются, да и программирование как таковое. Кроме того perl это действительно исключительно мощный язык. Вот убогий пых можно со всеми нюансами выучить за неделю, а на все нюансы perl уйдут годы. Я плотно занимаюсь им около четырех лет, но по прежнему не могу сказать, что полностью знаю этот язык, более того, я не встречал ни одного умного(дураки могут всякое ляпнуть) человека, который бы мог сказать такое.

>С коннектом я действительно напартачил. Однако без prepare внутри цикла-никак, поскольку мне нужно выполнять изменяющийся по циклу запрос к базе.

Ой, правда что-ли? То есть ты думаешь, что prepare и execute разделены на две функции в DBI и мускульном API чисто по приколу?

>Если в двух
>словах, мне необходимо:
>1. Выбрать из базы числовые значения поля по IP, а потом просуммировать
>эти значения.
>2. Выбрать из базы числовые значения поля по IP, а потом отсортировать
>их по возрастанию.
>Со вторым заданием сложнее, поскольку я не знаю верхнюю границу массива.

Смотрю с русским у тебя тоже нелады, я спрашивал совсем другое. Ну ладно, будем отвечать на то, что ты дал.
С одной стороны задачи сортировки и суммирования можно решить при помощи sql, пример вам дали. С другой стороны бывают ситуации, когда такой вариант не подходит, например нужно сортировать по ip.

Итак выборка данных. Я бы конечно воспользовался возможностями like в мускуле, дабы послать всего два запроса, а не 500+, ибо за последнее можно схлопотать по шапке или вообще вылететь с работы. Но пришлось бы слишком много нового демонстрировать.

my $dbh = DBI->connect($db_host,$db_user,$db_pass);
my $sth = $dbh->prepare("SELECT bytes,time FROM $tbl1 WHERE ip=?");
#обрати внимание на знак вопроса, почитай в perldoc DBI про bind параметров.
for my $i (1..254) {
  for my $j (0..1) {
    my $ip="192.168.13$j.$i"
    $sth->execute($ip);
    my $data=$sth->fetchall_arrayref;
    #ну а теперь делаем с $data все, что нам нужно
  }
}

После подобного $data будет иметь вид:
[
  [byte1, time1],
  [byte2, time2],
  ...
]

Суммируем байты циклом, возможности map оставим на будущее
my $sum=0;
$sum+=$_->[0] for @$data;

Выводим в сортированном по byte виде
print  "bytes: $_->[0] time: $_->[1]\n"  for sort{$a->[0] <=> $b->[0]} @$data
Для реверса меняем $a и $b местами. Для числовой сортировки по time используем [1] вместо [0]. В принципе сложность сортировки ограничена только воображением и умением программиста, так как фактически мы задаем функцию сравнения двух элементов.

Для дальнейшего общения рекомендую извинится за называние perl убогим языком.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "Массив значений при выборке из базы"  +/
Сообщение от phpcoder email(??) on 10-Июл-09, 12:52 
>Для дальнейшего общения рекомендую извинится за называние perl убогим языком.

А ты тогда извинишься за называние php "убогим пыхом"? ;-)

P.S. Друзья, давайте жить дружно! (с)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

12. "Массив значений при выборке из базы"  +/
Сообщение от angra (ok) on 10-Июл-09, 13:33 
Ничего не имею против php, отличный язык для своей области. Однако это не отменяет того что он убогий, то бишь обладающий очень ограниченными возможностями, по сравнению с рядом других ЯП. Хотя если сравнивать с brainfuck, то php тот еще монстр :)
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Массив значений при выборке из базы"  +/
Сообщение от Andrey (??) on 10-Июл-09, 08:36 
>14-я строка, вместо того, чтобы отрабатывать
>после каждого IP, выводит значение лишь один раз(зато неоднократно), в конце
>программы. Хрень какая-то.

В этом мощном ЯП надо дёрнуть что-то. чтобы каждый print вываливался на экран.
поищи в доках или на гугле perl stdout flush


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Массив значений при выборке из базы"  +/
Сообщение от Andrey (??) on 10-Июл-09, 08:45 
>my $sth = $dbh->prepare(qq{SELECT bytes FROM $tbl1 WHERE ip='$ipaddr'});

кстати да, как заметил уважаемый jd:


select sum(bytes) as total_bytes from table where ip='xxx';

матчасть всё-таки надо подучить. но у вас всё получится, я в этом уверен.

http://www.google.com/search?hl=en&client=firefox-a&rls=org....

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Массив значений при выборке из базы"  +/
Сообщение от SubGun (ok) on 10-Июл-09, 11:31 
Большое спасибо за развернутый ответ.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2021 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру