Select from subquery 子查詢

Luff發表於2017-12-22

最近遇到比較複雜的資料庫查詢,多處用到 select from (subquery) 型別的子查詢,記錄下。

SQL

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;

Laravel

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 基本是一樣的。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

Luff

相關文章