在实际开发过程中时不时的会遇到一些统计查询的需求,面对复杂的查询需求可以直接手写原生 sql 之后直接 DB::select,当然也可以使用 Illuminate\Database\Query\Builder 组织查询程序,为了使代码更具可读性还是推荐使用 Query\Builder 较为优雅。
下面是备忘小例子
$query = DB::table('erp_cutover_statistic0')->whereBetween('statistic_at',[$this->start_date,$this->end_date]) ->select('qty_hs_new_r', 'qty_hs_new_s', 'qty_cu_new_r', 'qty_cu_new_s', 'qty_hs_follow', 'qty_cu_follow','qty_sh_seen_r','qty_sh_cu_seen_r','qty_sh_seen_s','qty_sh_cu_seen_s','qty_nh_seen','emp_id'); $queryToday = DB::table('erp_cutover_statistic0_today')->whereBetween('statistic_at',[$this->start_date,$this->end_date]) ->select('qty_hs_new_r', 'qty_hs_new_s', 'qty_cu_new_r', 'qty_cu_new_s', 'qty_hs_follow', 'qty_cu_follow', 'qty_sh_seen_r','qty_sh_cu_seen_r','qty_sh_seen_s','qty_sh_cu_seen_s','qty_nh_seen','emp_id'); $query->unionAll($queryToday); $unionAllSql = $query->toSql(); $start = $this->dateToKey($this->start_date); $end = $this->dateToKey($this->end_date); $data = DB::table('employee_dim')->join('department_tree',function ($join){ $join->on('employee_dim.dept_id','department_tree.dept_id') ->where($this->dept_filed,$this->dept_id); })->leftJoin(DB::raw('('.$unionAllSql.') sub'),'sub.emp_id','employee_dim.emp_key') ->addBinding($query->getBindings()) ->whereIn('position_id',$this->statPositionIds) ->groupBy('employee_dim.emp_key') ->orderBy('dept_name','ASC') ->orderBy('emp_name','ASC') ->selectRaw('emp_name,dept_name,SUM(qty_hs_new_r) qty_hs_new_r,SUM(qty_hs_new_s) qty_hs_new_s,SUM(qty_cu_new_r) qty_cu_new_r,SUM(qty_cu_new_s) qty_cu_new_s,SUM(qty_hs_follow) qty_hs_follow, SUM(qty_cu_follow) qty_cu_follow,SUM(qty_sh_seen_r) qty_sh_seen_r,SUM(qty_sh_cu_seen_r) qty_sh_cu_seen_r, SUM(qty_nh_seen) qty\_nh_seen,fn_get_stereo_visit_r(emp_key,?,?,\'e\') as stereo_visit_r, fn_get_stereo_visit_s(emp_key,?,?,\'e\') as stereo_visit_s',[$start,$end,$start,$end]) ->skip($this->offset)->take($this->rows)->get();
实际查询时生成 sql
SELECT emp_name, dept_name, SUM(qty_hs_new_r) qty_hs_new_r, SUM(qty_hs_new_s) qty_hs_new_s, SUM(qty_cu_new_r) qty_cu_new_r, SUM(qty_cu_new_s) qty_cu_new_s, SUM(qty_hs_follow) qty_hs_follow, SUM(qty_cu_follow) qty_cu_follow, SUM(qty_sh_seen_r) qty_sh_seen_r, SUM(qty_sh_cu_seen_r) qty_sh_cu_seen_r, SUM(qty_nh_seen) qty_nh_seen, fn_get_stereo_visit_r ( emp_key, 20160101, 20180909, 'e' ) AS stereo_visit_r, fn_get_stereo_visit_s ( emp_key, 20160101, 20180909, 'e' ) AS stereo_visit_s FROM `employee_dim` INNER JOIN `department_tree` ON `employee_dim`.`dept_id` = `department_tree`.`dept_id` AND `dept1_id` = 394 LEFT JOIN ( ( SELECT `qty_hs_new_r`, `qty_hs_new_s`, `qty_cu_new_r`, `qty_cu_new_s`, `qty_hs_follow`, `qty_cu_follow`, `qty_sh_seen_r`, `qty_sh_cu_seen_r`, `qty_sh_seen_s`, `qty_sh_cu_seen_s`, `qty_nh_seen`, `emp_id` FROM `erp_cutover_statistic0` WHERE `statistic_at` BETWEEN 2016 - 01 - 01 AND 2018 - 09 - 09 ) UNION ALL ( SELECT `qty_hs_new_r`, `qty_hs_new_s`, `qty_cu_new_r`, `qty_cu_new_s`, `qty_hs_follow`, `qty_cu_follow`, `qty_sh_seen_r`, `qty_sh_cu_seen_r`, `qty_sh_seen_s`, `qty_sh_cu_seen_s`, `qty_nh_seen`, `emp_id` FROM `erp_cutover_statistic0_today` WHERE `statistic_at` BETWEEN 2016 - 01 - 01 AND 2018 - 09 - 09 ) ) sub ON `sub`.`emp_id` = `employee_dim`.`emp_key` WHERE `position_id` IN ( 5307, 1926, 1678, 5308, 5311, 5312, 5313, 5314, 5315, 1791, 1726, 1728, 5310, 5316, 5317, 5318, 5319 ) GROUP BY `employee_dim`.`emp_key` ORDER BY `dept_name` ASC, `emp_name` ASC LIMIT 20 OFFSET 0```
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于