Требуется много времени для выполнения сложного запроса mySql

Мой запрос выглядит так:

$result_portlist=mysql_query("SELECT
portfolio AS the_port,
SUM(balance * course) AS the_balance,
SUM(insurance * course) AS the_insurance
FROM banks_all
WHERE CONCAT(balance, insurance)!='0'
GROUP BY portfolio
",$db);

$myrow_portlist=mysql_fetch_array($result_portlist);
if(mysql_num_rows($result_portlist)>0) {
do {
echo '<span> value1, vaule2, value3...</span>';

$result_portlist1=mysql_query("SELECT
department AS the_department,
SUM(balance * course) AS the_balance,
SUM(insurance * course) AS the_insurance
FROM banks_all
WHERE CONCAT(balance, insurance)!='0'
AND portfolio='$myrow_portlist[the_port]'
GROUP BY department
",$db);

$myrow_portlist1=mysql_fetch_array($result_portlist1);
if (mysql_num_rows($result_portlist1)>0) {
do {
echo '<span> value1, vaule2, value3...</span>'

$result_portlist2=mysql_query("SELECT
manager_name AS the_manager,
SUM(balance * course) AS the_balance,
SUM(insurance * course) AS the_insurance
FROM banks_all
WHERE CONCAT(balance, insurance)!='0'
AND portfolio='$myrow_portlist[the_port]'
AND department='$myrow_portlist1[the_department]'
GROUP BY manager_name
",$db);

{
do {
echo '<span> value1, vaule2, value3...</span>';
} while ($myrow_portlist2=mysql_fetch_array($result_portlist2));
}
} while ($myrow_portlist1=mysql_fetch_array($result_portlist1));
}
} while ($myrow_portlist1=mysql_fetch_array($result_portlist1));
}

Таким образом, этот запрос занимает часы для таблицы с 40000+ строк с сотнями комбинаций portfolio+department+manager_name, Я подумал, что нужно сделать один запрос при запуске, который сгруппировал бы значения по manager_name а потом пусть php группа portfolio а также department, После создания этого запроса мой разум только что взорвался, и у меня не осталось свободной памяти, чтобы думать 🙂

Посоветуйте, пожалуйста, как изменить порядок запросов или упростить их, чтобы они выполнялись быстрее.

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

РЕДАКТИРОВАТЬ: вот изображение, как выглядит моя таблица (с вложенными таблицами):

ОБРАЗ

0

Решение

Причина, по которой это занимает много времени, заключается в том, что вы выполняете огромное количество запросов … Допустим, у вас есть 10 портфелей, в 10 отделах вы бы сделали 100 запросов. Эта сумма безумна, и уменьшение количества запросов довольно просто в вашем случае.

Я просто собрал бы все данные в одном запросе и использовал бы 3-уровневую группу с накопительным пакетом:

$result=mysql_query("SELECT
portfolio AS the_port,
department AS the_department,
manager_name AS the_manager,
SUM(balance * course) AS the_balance,
SUM(insurance * course) AS the_insurance
FROM banks_all
WHERE
CONCAT(balance, insurance)!='0'
GROUP BY
portfolio,
department,
manager_name
with ROLLUP
ORDER BY the_port,the_department,the_manager;
",$db);
echo '<table>';
while($row = mysql_fetch_assoc($result)){
if($row['the_port'] === null){
//This is the big total row... Let's skip it for now shall we?
continue;
}
echo '<tr>';
if($row['the_department'] === null){
echo '<td>Portfolio: '.$row['the_port'].'</td>';
}else{
if($row['the_manager'] === null){
echo '<td>Department: '.$row['the_port'].'</td>';
}else{
echo '<td>Manager: '.$row['the_port'].'</td>';
}
}
echo '<td>'.$row['the_balance'].'</td>';
echo '<td>'.$row['the_insurance'].'</td>';
echo '</tr>';
}
echo '</table>';

Этот запрос вернет все строки, сгруппированные по портфелям, затем сгруппированные по отделам, затем сгруппированные по менеджерам. Это вернет все строки из самой точной точки (ваше третье время), но с ROLLUP Вы также получите ряд для другой группы по уровням. Это так же, как если бы вы сделали GROUP BY portfolio,department а также GROUP BY portfolio внутри того же запроса.

В свернутых строках значение ключей, пропущенных в группе, будет равно NULL. Так что вы можете легко проверить the_manager, когда он нулевой, это означает, что у вас есть полный отдел, когда the_department является нулевым, у вас есть полное портфолио.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector