日付単位で number の合計が10以上のレコードのみを抽出する
データ
id | target_date | number |
---|---|---|
1 | 2021-09-01 | 1 |
2 | 2021-09-02 | 2 |
3 | 2021-09-01 | 3 |
4 | 2021-09-03 | 4 |
5 | 2021-09-04 | 4 |
6 | 2021-09-11 | 2 |
7 | 2021-09-06 | 5 |
8 | 2021-09-12 | 23 |
9 | 2021-09-12 | 10 |
10 | 2021-09-23 | 20 |
SQL
SELECT * FROM samples INNER JOIN( SELECT id, SUM(number) AS number_sum FROM samples GROUP BY samples.target_date ) AS samples1 ON samples1.id = samples.id WHERE number_sum >= 10;
これを Laravel の Eloquent を使ってサブクエリで書く
<?php $subQuery = Sample::selectRaw('sum(number) as number_sum') ->addSelect('id') ->groupBy('target_date'); Sample::joinSub($subQuery, 'samples1', 'samples1.id', 'samples.id') ->where([['number_sum', '>=', '10']]) ->get(['samples.id', 'target_date', 'number_sum']);
※ joinSub
は Eloquent じゃなくて QueryBuilder の機能だった
結果
id | target_date | number_sum |
---|---|---|
8 | 2021-09-12 | 33 |
10 | 2021-09-23 | 20 |