PHP 代码处理速度更快

标签 php mysql

我有一个正在运行的 PHP 程序,用于处理耗材库存。

我希望此代码在打开页面时能够更快地处理以更新耗材余额。

SUPPLIES 包含供应品的库存及其余额。

TRANSACTIONS包含接收、返回和发出的交易。

下面的程序检索表的 SUPPLIES 和 TRANSACTIONS,并计算所有 TRANSACTIONS 的余额,从而更新 SUPPLIES 的 MYSQL 表。

<?php
//Update supplies balance starts here
$supplies = DB::getInstance()->query("SELECT * FROM supplies ORDER BY id DESC");
foreach($supplies->results() as $supply) {
    $balance = 0;
    $transactions = DB::getInstance()->query("SELECT * FROM transactions ORDER BY id ASC");
    foreach($transactions->results() as $transaction) {
        if($transaction->code === $supply->id){
            if($transaction->transaction_type === "1"){
                $balance = $balance + $transaction->quantity; 
            } else if($transaction->transaction_type === "2"){
                $balance = $balance - $transaction->quantity; 
            } else if($transaction->transaction_type === "3"){
                $balance = $balance + $transaction->quantity; 
            }
        }
    }
    $supplied = new Supply();
    $supplied->find($supply->id);
    try {
        $supplied->update(array(
            'balance' => $balance,
        ));
    } catch (Exception $e) {
        die($e->getMessage());
    }
}
//Update supplies balance ends here
?>

最佳答案

正如@Phylogenesis所说,交易中的变化应该触发供应品的更新。

BEGIN TRANSACTION;
UPDATE transactions SET quantity = ..., code = ..., ....;
UPDATE supplies SET balance = balance +/- ....;
COMMIT;

因此,您不需要每次打开页面时都更新资源,也不需要重新计算整个表格。在一笔交易中完成此操作非常重要。理想情况下,如果可能的话,应该将其放置在事务表功能“TRIGGER ON UPDATE”中的数据库中。

如果不能,请尝试在数据库端计算供应的更新值,例如:

UPDATE supplies s
    SET balance = 
        (SELECT SUM(quantity) FROM transactions t WHERE t.code = s.id AND transaction_type IN (1, 3)) - 
        (SELECT SUM(quantity) FROM transactions t WHERE t.code = s.id AND transaction_type = 2);

它仍然比 PHP 慢,但快得多。

已编辑:我更新了查询示例以满足问题。

关于PHP 代码处理速度更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45607326/

相关文章:

php - MySQL:通过if语句选择奇数行

php - 如何防止/捕获 MySQLi 的连接错误

php - 在更新时我的 where 条件不起作用

php - MySQL COUNT、GROUP_CONCAT 和 GROUP BY 一起使用

MySQL过滤可能的空值

PHP 分页 - 无法检测页面

Mysql 选择日期和可能的情况

php - 在 Woocommerce 中的单个产品页面上显示特定的自定义产品属性

php - MySql - 如何使用分组依据计算查询的计数(*)?

多线程事务的 MySQL 配置