Laravel8 union後にgroupByする方法

例えば、友達(friends)テーブルから年齢、従業員(employees)テーブルから年齢を抽出して統合(union)し、更に年齢でgroup byし、年齢別のカウントを求めるする方法

生のSQLはこんな感じ

SELECT
    s.age,
    COUNT(s.age) cnt
FROM
    (
        SELECT
            f.name,
            f.age
        FROM
            friends f
        UNION 
            SELECT
                e.name,
                e.age
            FROM
                employyes e
    )s
GROUP BY
    s.age

Laravelのクエリビルダだとこう

  • 友達テーブルから抽出
$f = Friend::from('friends as f')
    ->select(
        'f.age'
    );
  • 従業員テーブルから抽出
$e = Employee::from('employees as e')
    ->select(
        'e.age'
    );
  • 友達テーブルと従業員テーブルを統合
$s = $f->union($e);
  • 統合したクエリをサブクエリにしてgroup byする
$records = DB::query()->fromSub($s, 's')
    ->select(
        DB::raw('count(s.age) as cnt')
    )
    ->groupBy('s.age')
    ->get();

困った時は、fromSub()で大抵はなんとかなる!

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です