程序员工具箱

laravel 子查询使用记录

2023-10-29  本文已影响0人  许一沐

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 基本是一样的。
*/

子查询使用事项: https://zhuanlan.zhihu.com/p/65673620

子查询(Sub Query),也称作内查询(Inner Query)或嵌套查询(Nested Query),
它 是一种嵌套在其他 SQL 查询的 WHERE 子句中的查询。

子查询必须遵循以下规则

上一篇 下一篇

猜你喜欢

热点阅读