【发布时间】:2015-03-05 08:25:38
【问题描述】:
我的查询如下所示:
$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));
}
因此,对于具有 40,000 多行和数百种 portfolio+department+manager_name 组合的表,此查询需要数小时才能执行。我的想法是在开始时进行一个查询,将值按manager_name 分组,然后让php 分组portfolio 和department。创建此查询后,我的大脑刚刚炸毁,没有可用的内存来思考:)
请告诉我如何重新排列此查询或如何简化它以减少执行时间。
提前致谢。
编辑:这是图片,我的表(带有嵌套表)的样子:
【问题讨论】:
-
尽可能合并查询
-
乍一看,您似乎可以使用一个查询(使用连接)来收集所有数据。所有 3 个表似乎只由 2 个字段连接,所以应该没有那么困难。
-
感谢您的回答。但不是
<span>,我得到了一个复杂的表,它将显示portfolio的总值,然后当我单击特定的portfolio时,它将打开按department分组的嵌套表,当我单击特定的department时,它将打开按manager_name分组的嵌套表。在这种情况下 JOIN 会有所帮助吗? -
所以对查询做一个解释,看看 MySQL 是如何实际执行它的,并向我们展示表结构以及这些表上任何索引的详细信息
-
@user3137740 所以你想一开始就加载嵌套表的数据?我会把这些嵌套的东西放在一个单独的 AJAX 请求中,然后按需加载。这将大大减少要传输的数据量。
标签: php mysql while-loop execution