laravel 在query group by 之后做
count()
会返回第一条记录的分组数量, 而不是全部记录的总数量, 需要 使用下面的方法来记录
$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');
// 合并绑定参数
$query->mergeBindings($subQuery);
OR
$query->mergeBindings($subQuery->getQuery());
$query->get();
/*
注意合并参数时 $subQuery 必须是 \Illuminate\Database\Query\Builder 类型
如果是 \Illuminate\Database\Eloquent\Builder 类型的,用 getQuery() 方法
不用 DB::raw() 直接写子查询,是因为查询带比较多的 where 条件和 group by, 而且内层查询和外层查询的 where 基本是一样的。
*/
子查询(Sub Query),也称作内查询(Inner Query)或嵌套查询(Nested Query),
它 是一种嵌套在其他 SQL 查询的 WHERE 子句中的查询。
子查询必须遵循以下规则:
- 子查询必须括在圆括号中
- 子查询的 SELECT 子句中只能有一个列,除非主查询中有多个列,用于与子查询选中的列相比较
- 子查询不能使用 ORDER BY,不过主查询可以。在子查询中,GROUP BY 可以起到同 ORDER BY 相同的作用
- 返回多行数据的子查询只能同多值操作符一起使用,比如 IN 操作符
- SELECT 列表中不能包含任何对 BLOB、ARRAY、CLOB 或者 NCLOB 类型值的引用
- 子查询不能直接用在集合函数中 B- ETWEEN 操作符不能同子查询一起使用,但是 BETWEEN 操作符可以用在子查询中