如何在 Laravel SQL 中使用 group by 获取重复数据的最后一条记录

How to get last record of duplicate data using group by in Laravel SQL

我想在我的 laravel 项目中使用 GroupBy 检索多行相同 ID 的最后一条记录。

table purchases

在laravel控制器中查询

DB::table('purchase_transactions')
                        ->where('due_amount','>', 0)
                        ->groupBy('purchases_id')
                        ->orderBy('created_at', 'desc')
                        ->get(['purchases_id', DB::raw('MAX(id) as id')]);

输出

但只有 id no 3 会是输出,因为只有 id no 3 purchases id 有到期金额。

如何解决这个问题?有人帮忙吗?

根据您的要求,您可以添加一个简单的havingRaw条件,即到期金额的总和大于或等于目前已支付的金额。

DB::table('purchase_transactions')
    ->groupBy('purchases_id')
    ->havingRaw('sum(due_amount) >= sum(paid_amount)')
    ->orderBy('created_at', 'desc')
    ->get(['purchases_id', DB::raw('MAX(id) as id')]);

注意:以上查询假定如果总支付金额大于总应付金额,则所有应付金额都已付清并且行保持其数学一致性每个 purchase_id.

如果 total bill amount/net payable amount 在另一个 table 中,则需要将 table 与此查询进行内部连接,并且 havingRaw() 函数几乎没有变化。请参阅以下查询

DB::table('purchase_transactions')
    ->join('purchases', 'purchases.purchases_id', '=', 'purchase_transactions.purchases_id')
    ->groupBy('purchase_transactions.purchases_id')
    ->havingRaw('sum(purchases.net_payable_amount) > sum(purchase_transactions.paid_amount)')
    ->orderBy('purchase_transactions.updated_at', 'desc')
    ->get(['purchase_transactions.purchases_id as purchases_id', DB::raw('MAX(purchase_transactions.id) as id')]);