2013-05-16 26 views
2

我尝试获取数据库中的每个客户每月的总销量,我用下面的代码:嵌套做,而在PHP循环

SELECT *, SUM(total_amount) 
FROM orders 
WHERE YEAR(order_date) = YEAR(NOW()) AND client = clientname 
GROUP BY MONTH(datetime) 

CLIENTNAME是持有客户数组变量。

这里是SQL查询执行(IM使用Dreamweaver):

mysql_select_db($database, $server); 

$query_clients = "SELECT client_name 
    FROM clients 
    ORDER BY client_name ASC"; 
$clients = mysql_query($query_clients, $server) 
    or die(mysql_error()); 
$row_clients = mysql_fetch_assoc($clients); 
$totalRows_clients = mysql_num_rows($clients); 

$clientname_MonthlySalesClient = "-1"; 

if (isset($row_clients['client_name'])) { 
    $clientname_MonthlySalesClient = $row_clients['client_name']; 
} 

mysql_select_db($database_server, $server); 

$query_MonthlySalesClient = 
    sprintf("SELECT *, SUM(total_amount) 
     FROM orders 
     WHERE YEAR(order_date) = YEAR(NOW()) 
     AND client = %s 
     GROUP BY MONTH(order_date)", 
    GetSQLValueString($clientname_MonthlySalesClient, "text")); 

$MonthlySalesClient = mysql_query($query_MonthlySalesClient, $server) or die(mysql_error()); 
$row_MonthlySalesClient = mysql_fetch_assoc($MonthlySalesClient); 

$totalRows_MonthlySalesClient = mysql_num_rows($MonthlySalesClient); 

然后我用下面的代码在PHP中:

<?php do { ?> 
<tr> 
    <td> 
    <?php echo $row_clients['client_name']; ?> 
    </td> 
    <?php do { ?> 
     <td> 
     <?php 
     echo number_format($row_MonthlySalesClient['SUM(total_amount)']); 
     ?> 
     </td> 
    <?php 
    } while ($row_MonthlySalesClient = mysql_fetch_assoc($MonthlySalesClient)); 
    ?> 
</tr> 
<?php } 
while ($row_clients = mysql_fetch_assoc($clients)); 
?> 

IM正确获得月度销量第一客户端,但对于下面的客户,它显示的结果为零。我不知道我错过了哪些代码来让它工作!

+0

您能显示生成'$ row_clients'的值的代码吗? – thatidiotguy

+0

向我们展示了你构造你的结果的方式.... $ clients和$ MonthlySalesClient – Hackerman

回答

3

您发布的代码不起作用。从the docs

做,而循环非常相似,循环,除了真相表达在每个迭代结束,而不是在开始时检查。

换句话说,$row_MonthlySalesClient = mysql_fetch_assoc($MonthlySalesClient)尚未在内部do-while循环的第一次迭代中运行。

此外,我没有看到你在哪里实际执行SQL查询。是否有更多的代码?

尝试更改为while循环,然后检测该集是否为空以显示“空结果”消息。从代码的角度来看,并不能保证查询的结果集中会有任何行,这就意味着使用do-while意味着什么。

编辑:我认为你的问题是你只执行一次客户端名称查询,而不是每行一次。至少在你展示给他们的循环中,$MonthlySalesClient的结果只会有第一个客户端名称的结果。

尝试移动$MonthlySalesClient的所有内容,其中包括$query_格式化,mysql_query()和外部循环中的mysql_fetch_assoc()调用。这应该为您尝试构建的每个客户端信息表格行提供新的每月数据。

+0

其实我忘了粘贴查询,在这里: – user1814160

+0

因为你在查询后执行sql提取,所以'do-while'循环将起作用。大多数人仍然只是写'while($ row = fetch($ result){// stuff}',因为你仍然不能保证有任何结果。我想我会看到你实际询问的问题,用另一位代码回答。 –