Работа с большим объемом данных, объединение запросов к базе данных

Webage

Новичок
Добрый вечер уважаемые пользователи. Столкнулся я с проблемой, для меня она на данный момент сложна и решение я найти не смог, вернее смог, но оно очень кривое. Итак суть проблемы. Не так давно я начал писать систему аналитики продаж. Задача над которой я сейчас бьюсь в следующем. Имеется база данных в MySQL, в ней таблица в которой находиться данные по продажам с 2013 по текущий год, порядка 70 тыс. записей. Структура таблицы следующая:

`sales` (

`product_number` text NOT NULL,

`product_name` text NOT NULL,

`sale_date` text NOT NULL,

`sale_date_ut` int(11) NOT NULL,

`manager` text NOT NULL,

`company_name` text NOT NULL,

`quantity_goods` int(11) NOT NULL,

`cost_sales` int(11) NOT NULL,

`transaction_number` int(11) NOT NULL,

`cost_goods` int(11) NOT NULL,

`inn` int(11) NOT NULL,

`kpp` int(11) NOT NULL,

`company_identifier` text NOT NULL,

`empty` int(11) NOT NULL

)


Где:

product_number - артикул товара

sale_date_ut - дата продажи в unix time

quantity_goods - количество проданного товара.


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

HTML:
<form class="navbar-form navbar-right" method="post" role="form">

              <input name="change_sales_form" type="hidden" value="send">

            <div class="form-group input-group col-xs-2">

              <input type="text" name="change_sales" placeholder="" class="form-control" value="'.$_POST['change_sales'].'">

               <span class="input-group-addon">%</span> 

            </div>

            <div class="form-group">

              <input type="text" id="from" name="from" placeholder="от" class="form-control" value="'.$_POST['from'].'">

            </div>

             <div class="form-group">

              <input type="text" id="to" placeholder="до" name="to" class="form-control" value="'.$_POST['to'].'">

            </div>

            <button type="submit" class="btn btn-success">Смотреть</button>

          </form>
Разбираю время:

PHP:
  $date_from_form = explode("-", $_POST['from']); 

    $date_to_form = explode("-", $_POST['to']);

    $date_from_unix_now=mktime(0, 0, 0, $date_from_form[1], $date_from_form[0], $date_from_form[2]);

    $date_to_unix_now=mktime(23, 59, 0, $date_to_form[1], $date_to_form[0], $date_to_form[2]);

    $year_last=$date_from_form[2]-1;

    $date_from_unix_last=mktime(0, 0, 0, $date_from_form[1], $date_from_form[0], $year_last);

    $date_to_unix_last=mktime(23, 59, 0, $date_to_form[1], $date_to_form[0], $year_last);
Нахожу только уникальные артикулы товара за текущий период и за тот же период предыдущего года и заношу все это в массив:


PHP:
$get_distinct_items_now = $conn->Execute("SELECT DISTINCT product_number FROM `sales` WHERE product_number REGEXP '^[0-9]+$' AND `sale_date_ut`>=\"".$date_from_unix_now."\" AND `sale_date_ut`<=\"".$date_to_unix_now."\"");

if ($get_distinct_items_now && $get_distinct_items_now->RecordCount() > 0) {

    while (!$get_distinct_items_now->EOF) {

       $items_array[]=$get_distinct_items_now->fields['product_number'];

    $get_distinct_items_now->MoveNext(); 

    }

}

$get_distinct_items_last = $conn->Execute("SELECT DISTINCT product_number FROM `sales` WHERE product_number REGEXP '^[0-9]+$' AND `sale_date_ut`>=\"".$date_from_unix_last."\" AND `sale_date_ut`<=\"".$date_to_unix_last."\"");

if ($get_distinct_items_last && $get_distinct_items_last->RecordCount() > 0) {

    while (!$get_distinct_items_last->EOF) {

        $items_array[]=$get_distinct_items_last->fields['product_number'];

    $get_distinct_items_last->MoveNext(); 

    }

}
Готовлю массив для разбора:

PHP:
$items_array=array_unique($items_array);
Далее запрашиваю информацию по каждому элементу массива и тут главный затык, если делать как сейчас, при выборе интервала в несколько месяцев скрипт обрабатывает запрос около 3-х минут, я так понимаю, что все запросы можно объединить в один и скорость выполнения будет выше.

PHP:
foreach ($items_array as $value) {

    $get_item_summ_now=$conn->Execute("SELECT product_number, product_name, SUM(quantity_goods) AS sum_quantity_goods FROM `sales` WHERE `product_number`=\"".$value."\" AND `sale_date_ut`>=\"".$date_from_unix_now."\" AND `sale_date_ut`<=\"".$date_to_unix_now."\"");


    $get_item_summ_last=$conn->Execute("SELECT product_number, product_name, SUM(quantity_goods) AS sum_quantity_goods FROM `sales` WHERE `product_number`=\"".$value."\" AND `sale_date_ut`>=\"".$date_from_unix_last."\" AND `sale_date_ut`<=\"".$date_to_unix_last."\"");


    $prirost_percent=(($get_item_summ_now->fields['sum_quantity_goods']/$get_item_summ_last->fields['sum_quantity_goods'])-*100)-100;


    $prirost_percent=round($prirost_percent, 0);

    if ($prirost_percent<$_POST['change_sales']) {

    $items_list.='<tr>

            <td>'.$value.'</td>

             <td>'.$get_item_summ_last->fields['sum_quantity_goods'].'</td>   

            <td>'.$get_item_summ_now->fields['sum_quantity_goods'].'</td>

                <td>'.$prirost_percent.'</td>

                    </tr>';

    }

}
Есть ли возможность объединить два запроса и сразу на стороне MySQL считать прирост и если прирост ниже условия заданного в форме выводить его в таблицу?
 
Последнее редактирование модератором:
Сверху