利用leftJoinsub建立子查詢讓查詢語句groupBy和orderBy一起使用

catnotone發表於2021-11-22

開發有時候經常遇到需要把sql查詢出來的資料去重並按照一個查詢出的統計欄位排序.
這裡舉一個rightJoinSub的例子:
我要統計一個施工專案下面的工種 並根據工種人數倒敘排列

//首先統計出該施工專案下的人員工種和每個工種的總人數
        $workTypes = Worker::from('workers AS w')
            ->leftJoin('projects AS p','p.projectCode', '=', 'w.pCode')
            ->leftJoin('worker_types AS wt', 'w.workType', '=', 'wt.id')
            ->where('w.pCode', $project)
            ->groupBy('w.workType')
            ->select('wt.id', DB::raw('IFNULL(wt.name, "其他") AS workType'),                 DB::raw('COUNT(w.id) AS total'));

//根據工種的id右關聯工種表然後根據上面查出的欄位進行排序
        $list = WorkerType::from('worker_types AS wt')
            ->rightJoinSub($workTypes, 'wts', 'wts.id', '=', 'wt.id')
            ->orderBy('wts.total', 'DESC')
            ->get(['wt.id', DB::raw('IFNULL(wt.name, "其他") AS workType'),                     'wts.total']);

leftJoinSub同理
有一點 如果資料量很大的話 這樣的介面返回會有點慢.

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章