laravel 子查詢使用記錄

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 操作符可以用在子查詢中
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容