美文网首页程序员工具箱
laravel 子查询使用记录

laravel 子查询使用记录

作者: 许一沐 | 来源:发表于2023-10-29 13:01 被阅读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 子句中的查询。

子查询必须遵循以下规则

  • 子查询必须括在圆括号中
  • 子查询的 SELECT 子句中只能有一个列,除非主查询中有多个列,用于与子查询选中的列相比较
  • 子查询不能使用 ORDER BY,不过主查询可以。在子查询中,GROUP BY 可以起到同 ORDER BY 相同的作用
  • 返回多行数据的子查询只能同多值操作符一起使用,比如 IN 操作符
  • SELECT 列表中不能包含任何对 BLOB、ARRAY、CLOB 或者 NCLOB 类型值的引用
  • 子查询不能直接用在集合函数中 B- ETWEEN 操作符不能同子查询一起使用,但是 BETWEEN 操作符可以用在子查询中

相关文章

网友评论

    本文标题:laravel 子查询使用记录

    本文链接:https://www.haomeiwen.com/subject/eakvidtx.html