利用leftJoinsub创建子查询让查询语句groupBy和orderBy一起使用

开发有时候经常遇到需要把 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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。