2013-09-10 5 views
0

У меня есть ERP-система, запрограммированная на PHP с базой данных mySQL со всеми моими заказами в течение последних 4 лет. Теперь я хотел бы создать функцию для создания статистики продаж. Должна быть предусмотрена возможность выбора критериев поиска, таких как Salesman, Department и year/period.Создание статистики продаж для моей системы ERP, но производительность плохая

Статистика продаж должна быть сгруппирована по желанию клиента. Так же, как на иллюстрации этой ссылке: http://maabjerg.eu/illustration_stat.png

Мои клиенты стол:

customers 
-------------------- 
id - int - auto - primary 
name - varchar(100) 

Мои заказы таблице:

orders 
------------------- 
id - int - auto - primary 
customerId - int 
departmentId - int 
salesmanId - int 
orderdate - datetime 
invoicedate - datetime 
quantity - int 
saleprice - decimal(10,2) 

У меня не было никаких проблем, делая это, но производительность очень плохо. То, как я сделал это раньше было как:

foreach($customers as $customer) 
{ 

foreach($months as $month) 
{ 
    $sql = mysql_query("select sum(quantity*saleprice) as amount from orders where DATE_FORMAT(invoicedate, '%m-%Y') = '".$month."-".$_REQUEST["year"]."' AND customerId='".$customer->id."'",$connection) or die(mysql_error()); 
$rs = mysql_fetch_assoc($sql); 

$result[$customerId][$month] = $rs["amount"]; 

} 

} 

Я надеюсь, что кто-то может дать мне совет, как сделать это наилучшим образом.

Заранее спасибо.

Штеффен

+0

Почему бы просто не запустить все это как один SQL-запрос? – Fluffeh

+0

Сделайте «EXPLAIN» и посмотрите, есть ли возможность добавлять индексы. – Halcyon

ответ

0

Это ваш запрос:

select sum(quantity*saleprice) as amount 
from order 
where DATE_FORMAT(invoicedate, '%m-%Y') = '".$month."-".$_REQUEST["year"]."' AND 
     customerId='".$customer->id."' 

Как написано, если вы хотите, чтобы ускорить его, добавить индекс order(customerId).

Вы также должны сделать это как один запрос:

select c.name, sum(quantity*saleprice) as amount 
from customers c left outer join 
    order o 
    on c.id = o.customerId 
where DATE_FORMAT(invoicedate, '%m-%Y') = '".$month."-".$_REQUEST["year"]."' AND 
     customerId='".$customer->id."' 
group by c.name; 

Вы можете переписать запрос немного, и создать индекс на order(customerId, invoicedate). Это потребует создания констант для начала и окончания периода, а затем сделать что-то вроде:

select c.name, sum(quantity*saleprice) as amount 
from customers c left outer join 
    order o 
    on c.id = o.customerId 
where invoicedate $StartDate and $EndDate AND 
     customerId='".$customer->id."' 
group by c.name; 

MySQL не может использовать индекс, когда есть вызов функции на колонке.

+0

Большое спасибо - я попробую это сразу. – d4ta

+0

Он работал отлично .. Спасибо =) – d4ta

 Смежные вопросы

  • Нет связанных вопросов^_^