PHP 中 foreach 循环下多行的总和

问题描述

假设,我已将所有产品代码保存在名为 code_table 的表中,我在这里不代表该表。

我正在尝试获取 sum() 的 LAST INSERT rate 列行。 在我使用的以下代码中,但我无法按预期获得输出。 请帮助我如何获得 foreach 循环下的所有产品 SKU 率。

我已阅读所有主题,但对我没有帮助。

表格 = 测试

ID | product_sku | rate | code
-------------------------------
1  | 1230        | 23   | 111 
-------------------------------
2  | 1230        | 25   | 111  //COUNT THIS ROW ONLY
-------------------------------
3  | 1231        | 20   | 222 
-------------------------------
4  | 1231        | 26   | 222  //COUNT THIS ROW ONLY

Total SUM WILL BE = 51 // ROW ID 2 + 4 AS 25 + 26 = 51

$sql = $con->prepare("SELECT * FROM `code_table`");
$sql->execute();
foreach ($result as $data => $value) {
    $stmt = $con->prepare("SELECT *,SUM(`rate`) AS `totalCost` 
                             FROM `test` 
                             WHERE `code` = :code");
    $stmt->execute(array(':code' => $value['product_code']));
    while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $sum = 0;
        $sum+= $data['totalCost']
    }
}

echo $sum; //expected result = 51

解决方法

这里不需要 PHP 循环 - 只需正确查询即可。

您需要为每个代码插入最后一行,因此使用

提取这些行的 ID
SELECT max(id) as id FROM myTable group by `code`;

然后将其连接回原始表以提取这些行:

select sum(rate) from myTable 
    inner join (SELECT max(id) as id FROM myTable group by `code`) sq on (myTable.id = sq.id) ;

最后,将其 INNER JOIN 到 code_table 以按所需代码过滤,并将结果相加:

select sum(rate) from myTable
    inner join (SELECT max(id) as id FROM myTable group by `code`) sq on (myTable.id = sq.id) 
    inner join code_table on (myTable.code = code_table.code);

演示:https://www.db-fiddle.com/f/6ReEYsoQdjHV2XCi8CbRAJ/2

由于这里没有用户数据,因此无需准备查询 - 只需运行它:

$query = "select sum(rate) from myTable inner join (SELECT max(id) as id FROM myTable group by `code`) sq on (myTable.id = sq.id) inner join code_table on (myTable.code = code_table.code)";
$stmt = $con->query($query);

$data = $stmt->fetch();

$total = $data[0];  // 51