so i having this kind of query where i do grouping with max date/period like this
$table_data = App\salesreport::join(DB::RAW('(SELECT company_id, MAX(period) AS max_period FROM salesreport GROUP BY company_id ) latest_report'),function($join){
$join->on('salesreport.company_id','=','latest_report.company_id');
$join->on('salesreport.periods','=','latest_report.max_periods');
})->get()
and it work just fine, it can group all company into one and then showing only the latest one MAX(period)
. And then i want to tweak it more, how about if i want to show not only the latest one, but also the latest two of each company? so each company will returning 2 report that is the latest of all report.
and then i think maybe adding LIMIT 2
will make it works so i put it like this
$table_data = App\salesreport::join(DB::RAW('(SELECT company_id, MAX(period) AS max_period FROM salesreport GROUP BY company_id ) latest_report'),function($join){
$join->on('salesreport.company_id','=','latest_report.company_id');
$join->on('salesreport.periods','<=','latest_report.max_periods');
$join->limit(2)
})->get()
but it has no effect and just showing all report of all company which have period <= max_periods.
to make things more clearer here is my table that i do joining
so here is my sales report table
+----+------------+-------+------------+
| id | company_id | price | periods |
+----+------------+-------+------------+
| 1 | A1 | 500 | 2016-07-12 |
| 2 | A2 | 540 | 2017-01-21 |
| 3 | A1 | 440 | 2017-01-19 |
| 4 | A1 | 440 | 2018-01-19 |
| 5 | A2 | 330 | 2016-01-12 |
| 6 | A2 | 333 | 2018-01-22 |
+----+------------+-------+------------+
and then using the first query up there then i will get this kind of table
+----+------------+-------+------------+
| id | company_id | price | periods |
+----+------------+-------+------------+
| 4 | A1 | 440 | 2018-01-19 |
| 6 | A2 | 333 | 2018-01-22 |
+----+------------+-------+------------+
so what i want is to get this kind of table
+----+------------+-------+------------+
| id | company_id | price | periods |
+----+------------+-------+------------+
| 4 | A1 | 440 | 2018-01-19 |
| 3 | A1 | 440 | 2017-01-19 |
| 6 | A2 | 333 | 2018-01-22 |
| 2 | A2 | 540 | 2017-01-21 |
+----+------------+-------+------------+
so the latest 2 of all for each company.. is it possible? with only one request?
Using this trick :
App\salesreport::join(DB::RAW('(SELECT company_id, GROUP_CONCAT(periods ORDER BY periods DESC) grouped_periods FROM salesreport GROUP BY company_id ) latest_report'),function($join){
$join->on('salesreport.company_id','=','latest_report.company_id');
$join->whereBetween(DB::raw('FIND_IN_SET(`salesreport`.`periods`, `latest_report`.`grouped_periods`)'), [1, 2]);
})->get();
Using this trick :
App\salesreport::join(DB::RAW('(SELECT company_id, GROUP_CONCAT(periods ORDER BY periods DESC) grouped_periods FROM salesreport GROUP BY company_id ) latest_report'),function($join){
$join->on('salesreport.company_id','=','latest_report.company_id');
$join->whereBetween(DB::raw('FIND_IN_SET(`salesreport`.`periods`, `latest_report`.`grouped_periods`)'), [1, 2]);
})->get();
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.