如何在PHP中计算查询结果总计并输出各列求和值?
在PHP中计算数据库查询结果的列总计并输出求和值
看起来你想要实现的是:先展示符合条件的数据库记录中指定列的数值,然后在表格末尾输出这些列的总计求和值。不过从你给出的代码来看,目前的写法存在一些问题——比如你在查询里用了select *,但却试图从结果行中获取SUM(element_10)这类聚合值,这是行不通的,因为SUM()是聚合函数,需要在SQL语句里明确声明才能得到结果。
下面给你两种可行的实现方案:
方案1:利用SQL直接计算总计(推荐)
数据库对聚合计算的效率比PHP更高,所以优先推荐这种方式。你可以分两次查询:一次获取所有明细数据,一次获取各列的总计值;或者用UNION ALL把明细和总计合并成一个结果集。
示例代码(分两次查询)
<?php if ($stationid == "") { // 1. 查询明细数据 $query = "SELECT element_10, element_11, element_12, element_13, element_14, element_15 FROM " . $tablename . " WHERE date_created >= '" . $startdate . "' AND date_created <= '" . $enddate . "' AND status='1' ORDER BY id desc"; $result = do_query($query); $total = mysql_num_rows($result); // 2. 查询各列的总计值 $sum_query = "SELECT SUM(element_10) as sum_static, SUM(element_11) as sum_gif, SUM(element_12) as sum_ibv, SUM(element_13) as sum_html5, SUM(element_14) as sum_landing, SUM(element_15) as sum_revs FROM " . $tablename . " WHERE date_created >= '" . $startdate . "' AND date_created <= '" . $enddate . "' AND status='1'"; $sum_result = do_query($sum_query); $sum_row = do_fetch_result($sum_result); ?> <?php if ($total > 0) { ?> <table> <!-- 表头部分 --> <tr> <th>Static</th> <th>IBV</th> <th>GIF</th> <th>HTML5</th> <th>Landing</th> <th>Revs</th> </tr> <?php while($row = do_fetch_result($result)){ ?> <tr> <td><?php echo $row['element_10']; ?></td> <td><?php echo $row['element_12']; ?></td> <td><?php echo $row['element_11']; ?></td> <td><?php echo $row['element_13']; ?></td> <td><?php echo $row['element_14']; ?></td> <td><?php echo $row['element_15']; ?></td> </tr> <?php } ?> <!-- 输出总计行 --> <tr style="font-weight: bold;"> <td><?php echo $sum_row['sum_static'] ?: 0; ?></td> <td><?php echo $sum_row['sum_ibv'] ?: 0; ?></td> <td><?php echo $sum_row['sum_gif'] ?: 0; ?></td> <td><?php echo $sum_row['sum_html5'] ?: 0; ?></td> <td><?php echo $sum_row['sum_landing'] ?: 0; ?></td> <td><?php echo $sum_row['sum_revs'] ?: 0; ?></td> </tr> </table> <?php } ?> <?php } ?>
方案2:在PHP循环中累加计算
如果不想额外执行一次查询,也可以在遍历明细数据的同时,用变量累加各列的数值,最后输出总计。
示例代码
<?php if ($stationid == "") { $query = "SELECT element_10, element_11, element_12, element_13, element_14, element_15 FROM " . $tablename . " WHERE date_created >= '" . $startdate . "' AND date_created <= '" . $enddate . "' AND status='1' ORDER BY id desc"; $result = do_query($query); $total = mysql_num_rows($result); // 初始化累加变量 $total_static = 0; $total_gif = 0; $total_ibv = 0; $total_html5 = 0; $total_landing = 0; $total_revs = 0; ?> <?php if ($total > 0) { ?> <table> <tr> <th>Static</th> <th>IBV</th> <th>GIF</th> <th>HTML5</th> <th>Landing</th> <th>Revs</th> </tr> <?php while($row = do_fetch_result($result)){ // 累加各列数值 $total_static += $row['element_10']; $total_gif += $row['element_11']; $total_ibv += $row['element_12']; $total_html5 += $row['element_13']; $total_landing += $row['element_14']; $total_revs += $row['element_15']; ?> <tr> <td><?php echo $row['element_10']; ?></td> <td><?php echo $row['element_12']; ?></td> <td><?php echo $row['element_11']; ?></td> <td><?php echo $row['element_13']; ?></td> <td><?php echo $row['element_14']; ?></td> <td><?php echo $row['element_15']; ?></td> </tr> <?php } ?> <!-- 输出总计行 --> <tr style="font-weight: bold;"> <td><?php echo $total_static; ?></td> <td><?php echo $total_ibv; ?></td> <td><?php echo $total_gif; ?></td> <td><?php echo $total_html5; ?></td> <td><?php echo $total_landing; ?></td> <td><?php echo $total_revs; ?></td> </tr> </table> <?php } ?> <?php } ?>
重要提醒
你当前使用的mysql_*系列函数已经被PHP官方废弃,并且在高版本PHP中完全移除了,存在安全风险(比如SQL注入)。建议尽快迁移到mysqli_*或者PDO扩展,同时记得使用预处理语句来防止SQL注入,比如用参数绑定替代直接拼接SQL字符串。
内容的提问来源于stack exchange,提问作者wolverine_1024
相关产品推荐
相关产品推荐

