Laravel 4 Query Builder – groupBy Max Date

маленький вопрос вопрос, у меня есть таблица:

id | user_id | paper_update ------------------------------ 1 | 1 | 30-5-2011 2 | 2 | 30-5-2012 3 | 3 | 30-5-2012 4 | 1 | 30-5-2013 5 | 2 | 30-5-2013 6 | 3 | 30-5-2014 7 | 4 | 30-5-2014 8 | 5 | 30-5-2014 9 | 5 | 30-5-2015 10 | 5 | 30-5-2016 11 | 1 | 30-5-2010 ------------------------------- 

То, что я хочу сделать, – это выбрать только те записи, где paper_update является максимальным между записями с одним и тем же user_id , на самом деле я хочу сгруппировать по user_id с максимальным значением paper_update . поэтому для этой таблицы он вернет это:

 id | user_id | paper_update ------------------------------ 4 | 1 | 30-5-2013 5 | 2 | 30-5-2013 6 | 3 | 30-5-2014 7 | 4 | 30-5-2014 10 | 5 | 30-5-2016 ------------------------------- 

Solutions Collecting From Web of "Laravel 4 Query Builder – groupBy Max Date"

Это самый простой и самый короткий способ получить дату GroupBy Max в laravel. Возьмите строки с максимальной датой с помощью группы user_id .

  $rows = DB::table('papers') ->select(DB::raw('id, max(paper_update) as year,user_id')) ->groupBy('user_id') //->orderBy('paper_update', 'desc') ->get(); 

Этот запрос laravel создаст такой запрос mysql, как этот

 select id, max(paper_update) as year from `papers` group by `user_id`; 

Вывод будет

 Array ( [0] => stdClass Object ( [id] => 4 [year] => 30-5-2013 [user_id] => 1 ) [1] => stdClass Object ( [id] => 5 [year] => 30-5-2013 [user_id] => 2 ) [2] => stdClass Object ( [id] => 6 [year] => 30-5-2014 [user_id] => 3 ) [3] => stdClass Object ( [id] => 7 [year] => 30-5-2014 [user_id] => 4 ) [4] => stdClass Object ( [id] => 10 [year] => 30-5-2016 [user_id] => 5 ) ) 

MySQL:

Вы можете использовать только Left Join и избегать Group By чтобы получить последний paper_update для каждого user_id :

 SELECT t1.* FROM paper AS t1 LEFT JOIN paper AS t2 ON (t1.user_id = t2.user_id AND t1.paper_update < t2.paper_update) WHERE t2.paper_update IS NULL; 

Предположим, что ваш стол называется paper .

СМОТРЕТЬ ДЕМО

Laravel Query Builder:

Я не эксперт в Laravel Query Builder, но вы можете попробовать следующее:

 $result = DB::table('paper AS t1') ->select('t1.*') ->leftJoin('paper AS t2', function( $join ){ $join->on( 't1.user_id', '=', 't2.user_id' ); $join->on( 't1.paper_update', '<', 't2.paper_update' ); }) ->whereNull('t2.paper_update') ->get(); 

Не знакомы с построителем запросов laravel, но в простой Mysql вы используете самосоединение с максимальным значением даты из той же таблицы

 select t.* from t join ( select `user_id`, max(`paper_update`)`paper_update` from t group by `user_id` ) t1 using(`user_id`, `paper_update`) 

Fiddle Demo