The OpenNET Project / Index page

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



Индекс форумов
Составление сообщения

Исходное сообщение
"Массив значений при выборке из базы"
Отправлено angra, 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 убогим языком.

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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