laravel 在query group by 之后做
count()
會返回第一條記錄的分組數(shù)量, 而不是全部記錄的總數(shù)量, 需要 使用下面的方法來記錄
$reportQuery = Db::table('match_report as a')
->leftJoin('match_report_product as b', function ($join){
/**@var \Hyperf\Database\Query\JoinClause $join*/
$join->on('a.id', '=', 'b.report_id')
->where('b.is_match', 1);
})->select(['a.id','a.partner_id','a.agentwe_id','a.company_no',
'a.create_time','a.status','a.fromstr',
Db::raw("group_concat(rd_b.product_corp_id) as product_corp_ids")])
->where('a.corp_id', $corp_id)->whereIn('a.status', [1, 3])
->where('a.create_time', ">=", $startTs)
->where('a.create_time', "<=", $endTs)
->groupBy("a.id");
$c = Db::table(DB::raw("({$reportQuery->toSql()}) as sub"))
->mergeBindings($reportQuery)
->count();
return $c;
laravel 在
join | left join
等連表后會在表的別名前面自動追加 配置中指定的表前綴, 如下面的sql: 你不能直接用b.product_corp_id
來引用字段
Db::raw("group_concat(rd_b.product_corp_id) as product_corp_ids")
Select from subquery
子查詢 的寫法:
/*
SELECT COUNT(*) FROM
(SELECT * FROM abc WHERE col1 = xxx and col2 = xxx GROUP BY col1) AS sub
WHERE col1 = xxx and col2 = xxx and col3 = xxx;
*/
use Illuminate\Support\Facades\DB;
$subQuery = DB::table('abc')->where('col1', 'xxx')->where('col2', xxx)->groupBy('col1');
$query = DB::table(DB::raw("({$subQuery->toSql()}) as sub"))
->select(DB::raw('count(*)'))
->where('col1', 'xxx')
->where('col2', 'xxx')
->where('col3', 'xxx');
// 合并綁定參數(shù)
$query->mergeBindings($subQuery);
OR
$query->mergeBindings($subQuery->getQuery());
$query->get();
/*
注意合并參數(shù)時 $subQuery 必須是 \Illuminate\Database\Query\Builder 類型
如果是 \Illuminate\Database\Eloquent\Builder 類型的搬瑰,用 getQuery() 方法
不用 DB::raw() 直接寫子查詢,是因為查詢帶比較多的 where 條件和 group by, 而且內(nèi)層查詢和外層查詢的 where 基本是一樣的。
*/
子查詢(Sub Query)捏悬,也稱作內(nèi)查詢(Inner Query)或嵌套查詢(Nested Query)奋早,
它 是一種嵌套在其他 SQL 查詢的 WHERE 子句中的查詢丸升。
子查詢必須遵循以下規(guī)則:
- 子查詢必須括在圓括號中
- 子查詢的 SELECT 子句中只能有一個列粗仓,除非主查詢中有多個列譬挚,用于與子查詢選中的列相比較
- 子查詢不能使用 ORDER BY空民,不過主查詢可以刃唐。在子查詢中羞迷,GROUP BY 可以起到同 ORDER BY 相同的作用
- 返回多行數(shù)據(jù)的子查詢只能同多值操作符一起使用,比如 IN 操作符
- SELECT 列表中不能包含任何對 BLOB画饥、ARRAY衔瓮、CLOB 或者 NCLOB 類型值的引用
- 子查詢不能直接用在集合函數(shù)中 B- ETWEEN 操作符不能同子查詢一起使用,但是 BETWEEN 操作符可以用在子查詢中