所以我正在创建这种查询
$data = App\SalesReport::with('company')->join(DB::RAW('(SELECT company_id, MAX(periods) AS max_periods FROM laporancu 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');
})->FilterPaginateOrder();
我想放where('periods','<=','2016-01-01')
,但我不知道我应该把它放在哪里......
我试图把它放在with('company')
之后,它不会在2015年返回salesreport,即使我认为我在数据库中有一些。所以经过实验,我想我知道它为什么会发生。
因为我有$join->on('salesreport.periods','=','latest_report.max_periods');
,甚至认为salesreport.periods
的周期小于2016-01-01,但由于该加入,它将始终与latest_report的最大句点匹配
所以我认为我应该在查询执行时添加那些where子句
DB::RAW('(SELECT company_id, MAX(periods) AS max_periods FROM laporancu GROUP BY company_id) latest_report')
但是怎么样?我应该把它放在哪里?
更新:确切的sql语句(没有公司关系)
SELECT salesreport.* FROM salesreport
INNER JOIN (SELECT company_id, MAX(periods) AS max_periods FROM salesreport GROUP BY company_id) AS latest_report
ON salesreport.company_id = latest_report.company_id AND salesreport.periods = latest_report.max_periods
WHERE salesreport.periods <= 2016-01-01;
更新2
所以我认为在检查了我的查询之后我发现我的查询有问题,所以在我的联接中我做MAX(periods)
因为它会一直返回这些字段的最高值,问题是我想限制我想要返回的价值有多高。
所以也许有人可以想到其他事情来帮助我实现这个目标吗?
答案 0 :(得分:0)
我已经在我自己的代码中做了一些研究,因为我经常需要这个,提出了这个解决方案:
$data = App\SalesReport::with('company')->join(DB::RAW('(SELECT company_id, MAX(periods) AS max_periods FROM laporancu 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');
})->where('periods','<=','2016-01-01')->FilterPaginateOrder();
如果有效,请告诉我。如果没有,你会得到什么错误:)
答案 1 :(得分:0)
$periods = '2016-01-01';
$data = App\SalesReport::with('company')->join(DB::RAW('(SELECT company_id, MAX(periods) AS max_periods FROM salesreport WHERE periods <= '$periods' 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');
})->where('periods','<=','2016-01-01')->FilterPaginateOrder();
希望它能帮助将来想要像我一样做类似查询的人