如何在 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')]);
我想在我的 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')]);