【问题标题】:PHP MYSQL looking for a way to group rows with mutiple details and totalsPHP MYSQL 正在寻找一种方法来对具有多个详细信息和总计的行进行分组
【发布时间】:2017-08-30 08:00:36
【问题描述】:

我想通过分组来分隔项目名称,然后显示详细信息。根据我的代码,它显示了详细信息,但只是在一行中。另外我没有求和功能。

输出应该是这样的

                Month | Contract Amount | Investment | Expense
Project Name 1  
                 Jan  | $9000           | $9000      | $100
                 Feb  | $10000          | $5000      | $500
Total:                | $19000          | $14000     | $600
Project Name 2
                 Jan  | $50000          | $2500      | $10000
                 Feb  | $10000          | $5000      | $500
                 Mar  | $20000          | $4500      | $1500
Total:                | $80000          | $12000     | $1200

我的源代码。

项目名称是“pn”

 <?php
 $pdo = Database::connect();

 $sql = 'SELECT *, tt_projects.name as pn, tt_projects.id
 FROM tt_client_project_binds
 INNER JOIN tt_projects
 ON tt_client_project_binds.project_id = tt_projects.id
 INNER JOIN rms_projects_budget
 on rms_projects_budget.project_id = tt_projects.id';

 $stmt = $pdo->prepare($sql);
 $stmt->execute();

 $categories = array();
 while (($row = $stmt->fetch(PDO::FETCH_ASSOC)))
 {

     $category = $row['pn'];
     $categories[$category][] = date('F', strtotime($row['month']));
     $categories[$category][] = $row['pn'];
     $categories[$category][] = $row['Contract_Amount'];
     $categories[$category][] = $row['investment'];
     $categories[$category][] = $row['expense'];

 }

 ?>
 <html>
     <body>
 <?php
foreach ($categories as $category => $consumption)
     { 
 ?>  
 <table class="table table-striped table-bordered">

 <thead>
 <tr>
 <th>Month</th>
 <th>Contract Amount</th>
 <th>Investment</th>
 <th>Expense</th>
 </tr>
 </thead>
 <tbody>

 <h4><?php echo $category; ?></h4>

 <?php
 foreach ($consumption as $details)
     {
 ?>
 <td><?php echo $details; ?></td>
 <?php
     }
 ?>
 <?php
     }
 ?>
     </body>
      </html>

非常感谢您的帮助。提前谢谢!

【问题讨论】:

  • 1.不要使用邪恶的SELECT *。命名您想要的列。 2. 查看表别名。它们使代码更易于阅读并且意味着更少的输入。
  • 完成,谢谢!
  • 能简单解释一下tt_client_project_binds、tt_projects、rms_projects_budget的表结构吗?
  • 因为乍一看,你上面的sql和表结构中的tt_client_project_binds似乎是多余的,当你可以简单地链接tt_projects和rms_projects_budget时

标签: php mysql sql datatables grouping


【解决方案1】:

好的,这是一个让事情运行起来的快速技巧,可能有一个比我的解决方案更好的解决方案,但这很有效。 xD

PS:我假设表结构类似于我在http://rextester.com/PJJML53507 设置的表结构

这是输出:http://rextester.com/HATU87511

<?php

 $pdo = Database::connect();

 $sql = <<<SQL
    SELECT p.name, group_concat('{"month":', pb.month,',"amount":[', pb.contract , ',', pb.investment, ',', pb.expense, ']}') AS detail,
    sum(pb.contract) AS sum_contract, sum(pb.investment) as sum_investment, sum(pb.expense) as sum_expense
    FROM tt_projects p
    INNER JOIN rms_projects_budget pb
    ON p.ID = pb.project_id
    GROUP BY p.name;
SQL;

 $stmt = $pdo->prepare($sql);
 $stmt->execute();

 $rows = $stmt->fetchall();

// Output - added \n for better viewing, you can remove it.

echo "<table><thead><th></th><th>Month</th><th>Contract Amount</th><th>Investment</th><th>Expense</th></thead>\n";

foreach ($rows as $row) {
    echo "<tr><td>" . $row['name'] . "</td><td colspan=4></td></tr>\n";
    $details = json_decode('{"detail":[' . $row['detail'] . ']}', true)['detail'];
    foreach($details as $detail) {
        $month = $detail['month'];
        echo "<tr><td></td><td>$month</td><td>" . implode("</td><td>", $detail['amount']) . "</td></tr>\n";
    }
    echo "<tr><td colspan=2>Total:</td><td>" . $row['sum_contract'] . "</td><td>" . $row['sum_investment'] . "</td><td>" . $row['sum_expense'] . "</td></tr>\n";
}

echo "</table>\n";
?>

解决方案的思路是将明细费用合并成 JSON 代码,让 SQL 代替 PHP 完成大部分工作。

通过使用 json_decode(),您可以立即将月份和金额格式化为相应的数组,一旦完成,您几乎可以做任何您想做的事情。

我还在末尾添加了总和列,只是为了懒得不写另一个变量来存储总和。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-03
    • 2015-10-29
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多