1 回答

TA貢獻1806條經驗 獲得超8個贊
我想您可以使用聯接查詢直接從數據庫獲取排名前 10 的企業和排名最低的 10 家企業,而不是循環所有企業記錄并手動計算其收入
對于排名前 10 的業務,您可以對其余相關表使用內部聯接
$topBusinesses = DB::query()
->select('b.id', 'b.display_name', DB::raw('sum(p.amount_paid) as revenue')
->from('business as b')
->join('service as s', 'b.id', '=', 's.business_id')
->join('invoice as i', 's.id', '=', 'i.product_code_id')
->join('payment_transaction as p', function ($join) {
$join->on('p.id', '=', 'i.payment_transaction')
->where('p.amount_paid', '>', 0);
})
->groupBy('b.id', 'b.display_name')
->orderByDesc('revenue')
->limit(10)
->get();
對于最低 10 個業務,請使用發票和 payment_transaction 的左聯接,這樣,如果這些表中沒有某個業務的記錄,您仍然可以獲得這些業務記錄
$lowestBusinesses = DB::query()
->select('b.id', 'b.display_name', DB::raw('coalesce(sum(p.amount_paid),0) as revenue')
->from('business as b')
->join('service as s', 'b.id', '=', 's.business_id')
->leftJoin('invoice as i', 's.id', '=', 'i.product_code_id')
->leftJoin('payment_transaction as p', function ($join) {
$join->on('p.id', '=', 'i.payment_transaction')
->where('p.amount_paid', '>', 0);
})
->groupBy('b.id', 'b.display_name')
->orderBy('revenue')
->limit(10)
->get();
我使用 MySQL合并函數在返回 null 的情況下顯示 0 值sum(),如果您使用任何其他數據庫,您可以使用備用函數。
- 1 回答
- 0 關注
- 154 瀏覽
添加回答
舉報