маленький вопрос вопрос, у меня есть таблица:
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 -------------------------------
Это самый простой и самый короткий способ получить дату 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