如何将嵌套双Select统计SQL转换为Laravel查询构造器正确写法
错误原因
- 原始代码中
from方法内的子查询没有调用DB门面,属于语法错误 - 派生表(子查询返回的结果集)必须指定别名,不符合基础SQL语法规范
正确实现代码
写法1(Laravel原生闭包子查询,官方推荐)
完全匹配你给出的原生SQL逻辑:
$data = DB::selectRaw('keterangan_warga, count(keterangan_warga) as JumlahWarga') ->from(function ($query) { // 内层去重逻辑 $query->select('nokk_warga', 'keterangan_warga') ->distinct() ->from('warga'); }, 't') // 给派生表设置别名t,和原生SQL的`as t`对应 ->groupBy('keterangan_warga') ->get();
写法2(显式构建子查询传入)
适合需要复用子查询的场景:
// 先构建内层去重子查询 $subQuery = DB::table('warga') ->select('nokk_warga', 'keterangan_warga') ->distinct(); // 外层做分组统计 $data = DB::table(DB::raw("({$subQuery->toSql()}) as t")) ->mergeBindings($subQuery) // 合并子查询的参数绑定,避免SQL注入风险 ->selectRaw('keterangan_warga, count(keterangan_warga) as JumlahWarga') ->groupBy('keterangan_warga') ->get();
内容的提问来源于stack exchange,提问作者Shabrina Nurdiani S
相关产品推荐
相关产品推荐

