laravel 在query group by 之后做
count()會(huì)返回第一條記錄的分組數(shù)量, 而不是全部記錄的總數(shù)量, 需要 使用下面的方法來(lái)記錄
$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等連表后會(huì)在表的別名前面自動(dòng)追加 配置中指定的表前綴, 如下面的sql: 你不能直接用b.product_corp_id來(lái)引用字段
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ù)時(shí) $subQuery 必須是 \Illuminate\Database\Query\Builder 類型
如果是 \Illuminate\Database\Eloquent\Builder 類型的,用 getQuery() 方法
不用 DB::raw() 直接寫子查詢,是因?yàn)椴樵儙П容^多的 where 條件和 group by, 而且內(nèi)層查詢和外層查詢的 where 基本是一樣的。
*/
子查詢使用事項(xiàng): https://zhuanlan.zhihu.com/p/65673620
子查詢(Sub Query),也稱作內(nèi)查詢(Inner Query)或嵌套查詢(Nested Query),
它 是一種嵌套在其他 SQL 查詢的 WHERE 子句中的查詢。
子查詢必須遵循以下規(guī)則:
- 子查詢必須括在圓括號(hào)中
- 子查詢的 SELECT 子句中只能有一個(gè)列,除非主查詢中有多個(gè)列,用于與子查詢選中的列相比較
- 子查詢不能使用 ORDER BY,不過主查詢可以。在子查詢中,GROUP BY 可以起到同 ORDER BY 相同的作用
- 返回多行數(shù)據(jù)的子查詢只能同多值操作符一起使用,比如 IN 操作符
- SELECT 列表中不能包含任何對(duì) BLOB、ARRAY、CLOB 或者 NCLOB 類型值的引用
- 子查詢不能直接用在集合函數(shù)中 B- ETWEEN 操作符不能同子查詢一起使用,但是 BETWEEN 操作符可以用在子查詢中