MySQL在最后显示所有行和总和

时间:2014-10-03 22:21:29

标签: php mysql sql

我已经阅读了关于这个问题的大约20个不同答案,但要么我误解了答案,要么只是不点击。这是我的情况:

我有一张表格,列出了食谱的成分。表中的列是:ingredient_id,ingredient_title,ingredient_oz,ingredient_grams,ingredient_lbs(磅)等。

我想列出每种成分,然后在列出所有成分后,添加最后一行,总结所有的盎司,克,磅等。下面是我想要实现的输出的示例。

示例:

INGREDIENT TITLE    OZ   GRAMS   LBS
ingredient1         4    6       3
ingredient2         1    2       4
ingredient3         9    4       4

TOTAL               14   12      11

我的第一个想法是在SQL

中简单地使用SUM()AS
SELECT ingredient_title, ingredient_oz, ingredient_lbs, ingredient_grams, SUM(ingredient_oz) as oz_sum, SUM(ingredient_lbs) as lbs_sum, SUM(ingredient_grams) as grams_sum FROM ingredients

以下是我页面上的代码:

<!-- Beginning of table is here -->
<?php 
        while ($ingredientRow = $ingredients->fetch_assoc()) { ?>
          <tr>
            <td><?php echo $ingredientRow["ingredient_title"]; ?></td>
            <td><?php echo $ingredientRow["ingredient_oz"]; ?></td>
            <td><?php echo $ingredientRow["ingredient_lbs"]; ?></td>
            <td><?php echo $ingredientRow["ingredient_grams"]; ?></td>
          </tr>
          <?php } ?>
        </tbody>
        <tfoot>
            <tr>
              <td>TOTALS</td>
              <td><?php echo $ingredientRow["oz_sum"]; ?></td>
              <td><?php echo $ingredientRow["lbs_sum"]; ?></td>
              <td><?php echo $ingredientRow["grams_sum"]; ?></td>
            </tr>
          </tfoot>
      </table>
      <?php }?>

然而,所有这一切都是返回第一行(成分1),并且不返回剩余的行或总和。然后,当我继续阅读有关此内容时,我看到很少有人讨论使用&#34; group by&#34;同样。所以我试过了:

SELECT ingredient_title, ingredient_oz, ingredient_lbs, ingredient_grams, SUM(ingredient_oz) as oz_sum, SUM(ingredient_lbs) as lbs_sum, SUM(ingredient_grams) as grams_sum FROM ingredients GROUP BY ingredient_title

返回所有行,但不会返回总和。我在错误的领域进行分组吗?我是否需要对我试图求和的每个字段进行分组?

3 个答案:

答案 0 :(得分:4)

当你运行一个查询时,你会得到你要求的数据,所以基本上如果你运行一个查询来单独返回所有行 - 你将得到那些回来,没有总数。另一方面,如果您运行查询以仅获取总和/总计,则无法获得各行数据。

有两种方法可以获得你想要的东西。一个是通过查询完成的,一个是通过PHP本身完成的。

您可以编写联合查询以获取各行数据,然后返回总和,如下所示:

SELECT 
    ingredient_title, 
    ingredient_oz, 
    ingredient_lbs, 
    ingredient_grams
FROM 
    ingredients
union all
SELECT 
    ingredient_title, 
    SUM(ingredient_oz) as oz_sum, 
    SUM(ingredient_lbs) as lbs_sum, 
    SUM(ingredient_grams) as grams_sum 
FROM 
    ingredients

将返回两者。

或者您可以根据查询的第一部分编写快速的PHP代码片段,在代码中为您添加:

<?php

    $sql="SELECT 
        ingredient_title, 
        ingredient_oz, 
        ingredient_lbs, 
        ingredient_grams
    FROM 
        ingredients";
    //Execute query:
    while($result)
    {
        echo $result['ingredient_title'];
        echo $result['ingredient_oz'];
        // etc etc. Format as needed...
        $ingOz+=$result['ingredient_oz'];
        $ingLbs+=$result['ingredient_lbs'];
        $ingGrams+=$result['ingredient_grams'];
    }
    // And now the totals:
    echo $ingOz;
    echo $ingLbs;
    // etc etc.
?>

我个人可能会使用第二种方法 - 您不需要让数据库运行查询两次只是为了获得结果 - 而且您已经获得了所有单独的数据行,因此您也可以只需在变量中保留一个简单的运行总计即可根据需要显示。

答案 1 :(得分:1)

不要害怕运行2个单独的SQL查询,因为:

  • 分组(总和)的工作方式不同
  • 此外,代码逻辑将更具可读性和解耦性

$query = "
  SELECT
    ingredient_title,
    ingredient_oz,
    ingredient_lbs,
    ingredient_grams
  FROM ingredients
";
$ingredients = $db->query($query)->fetch_all();

$query = "
  SELECT
    SUM(ingredient_oz) as oz_sum,
    SUM(ingredient_lbs) as lbs_sum,
    SUM(ingredient_grams) as grams_sum
  FROM ingredients
";
$ingredientSummary = $db->query($query)->fetch_assoc();


<!-- Beginning of table is here -->
<?php
foreach ($ingredients as $ingredientRow) ?>
  <tr>
    <td><?php echo $ingredientRow["ingredient_title"]; ?></td>
    <td><?php echo $ingredientRow["ingredient_oz"]; ?></td>
    <td><?php echo $ingredientRow["ingredient_lbs"]; ?></td>
    <td><?php echo $ingredientRow["ingredient_grams"]; ?></td>
  </tr>
<?php } ?>
</tbody>
<tfoot>
<tr>
  <td>TOTALS</td>
  <td><?php echo $ingredientSummary["oz_sum"]; ?></td>
  <td><?php echo $ingredientSummary["lbs_sum"]; ?></td>
  <td><?php echo $ingredientSummary["grams_sum"]; ?></td>
</tr>
</tfoot>
</table>
<?php }?>

答案 2 :(得分:0)

我认为你在选择总和时应该把它作为一个单独的查询。当总和为所有行时,它是否可以获得每一行的总和?通过分组,您可以使SUM对每个组进行求和,并且每个成分都标记为一个组。