【问题标题】:PHP & MySQL : Show SUM of Something, Classified By Distinct CategoryPHP & MySQL:显示某事物的总和,按不同类别分类
【发布时间】:2016-07-27 18:10:21
【问题描述】:

你能帮帮我吗?如果您可以提供解释的答案,我将更加感激,因为我想了解更多信息,实际上我已经感谢这个社区。对我学习有很大帮助。但只有答案对我来说就足够了,因为我真的需要这个代码。

好的,现在我将定义问题。

现在,假设我有这些列的表格。 tbl_transaction -> id |参考 |描述 |价值 |类别 |子类

value 是一个整数列类型,具有一定数量的值。例如 100000 或 200000。

category and subcategory是VARCHAR类型的列,包含category和subcategory。

我想要的输出是它会根据其类别显示价值的总和。对于那个逻辑,我尝试了这个查询(它不是一个有效的 mySQL 代码标准,只是想显示一个逻辑)。

X = select DISTINCT category from tbl_transaction;
select SUM(value) from tbl_transaction WHERE category='X';

它实际上在 MySQL 上运行良好。但我也想将此结果打印到 PHP。问题是我无法将此值与 SUM 和 DISTINCT 类别一起打印。我想要类似的东西(在 PHP 输出/回显中):

类别 |类别总和

一个 | 100000

B | 400000

C | 500000

我在 php 上尝试了这些代码,它只能很好地打印类别,而不是类别的总和。

$query1=mysql_query("select DISTINCT category from tbl_transaction");
echo "<table><tr><td>Category</td>";
while($query2=mysql_fetch_array($query1))
{
echo "<tr><td>".$query2['category']."</td></tr></table>";

$query3=mysql_query("select SUM(value) from tbl_transaction WHERE category ="(select DISTINCT category from tbl_transaction)"");
echo "<table><tr><td>SUM of Category</td>";
while($query4=mysql_fetch_array($query3))
{
echo "<tr><td>".$query4['value']."</td></tr></table>";
}

}

我试了几次,结果是 null / resource id #7 / error。远不止于此,我实际上想要这样的东西。

A类

子类别A - 子类别A的总金额

子类别 B - 子类别 B 的总金额

子类别 C - 子类别 C 的总金额

总计 - A 类的总金额

B 类

子类别A - 子类别A的总金额

子类别 B - 子类别 B 的总金额

子类别 C - 子类别 C 的总金额

总计 - 类别 B 的总金额

提前感谢您,Stackoverflow 社区。

【问题讨论】:

  • $query3 的行中,你不能在内部使用双引号而不转义它们,因为外部字符串用双引号括起来。使用单引号或转义它们,如 \"
  • stop using mysql_* functions These extensions 已在 PHP 7 中被删除。了解 PDO 和 @987654325 的 prepared 语句@ 并考虑使用 PDO,it's really pretty easy
  • @JeremyHarris 非常感谢你,我以前不知道。下次我会按照你的建议尝试使用单引号或转义它们。
  • @JayBlanchard 我访问了你的网站,看看 mysql_* 函数是如何变成新格式的。我会更多地了解这一点,因为在我的大学里,实际上我并没有真正了解有关 mysql 的最新课程。非常感谢您提供的信息。

标签: php mysql arrays


【解决方案1】:

您可以尝试这样的 sql 语句来对按列分组的值求和:

SELECT SUM(value) as Total_val, category FROM tbl_transaction GROUP BY category

你可以像这样在 PHP 中使用它: (我将使用 PDO 输入,因为 mysql_ 命令现在已经过时了,不推荐使用)

//Creating connection
$connection=new PDO("mysql:host=127.0.0.1;dbname=database_name","root","");

//Creating main query, fetching main categories
$query=$connection->prepare("SELECT category, SUM(value) as MAIN_CAT_TOTAL_VAL FROM tbl_transaction GROUP BY category");
$query->execute(); //executing query

foreach($query->fetchAll() as $q) //fetching results
{
    echo "<b>".$q["category"].":<br/></b>"; //printing main category name

    //creating second query which sums value column and groups by sub category
    $query2=$connection->prepare("SELECT SUM(value) as TOTAL_VALUE, sub-category FROM tbl_transaction WHERE category=:p1 GROUP BY sub-category");   
    $query2->bindParam(":p1",$q["category"],PDO::PARAM_STR); //binding parameter to second query
    $query2->execute(); //executing second query
    foreach($query2->fetchAll() as $q2) //fetching the results
    {
        echo $q2["sub-category"]." -> ".$q2["TOTAL_VALUE"]."<br/>"; //printing the results
    }

    echo "total amount of category ".$q["category"]." = ".$q["MAIN_CAT_TOTAL_VAL"];
    echo "<hr/>"; //cosmetics
}

如果您正确编辑它应该可以工作。如果您不确定如何使用 PDO,可能看起来有点复杂,建议您看一下。

【讨论】:

  • 我现在一定要试试这个,希望我能成功。我会及时通知你,非常感谢你提供的代码,我真的很感激。
  • 我试过了,效果很好。非常感谢你,你刚刚帮助了我。我将学习这段代码的模式,以便以后可以在不同但相似的情况下使用这段代码。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
相关资源
最近更新 更多