Laravel Group By 查询未从每个组中选择最高记录
Laravels GroupBy query is not selecting top record from each group
我有一个包含多条记录的数据库,如下所示:
Id | user_id | city | users_language | updated_at |
_____________________________________________________________________
383 | 13 | New York | PHP | 2015-01-10 05:06:58
382 | 13 | New York | JAVA | 2015-01-10 04:06:58
381 | 13 | New York | RUBY | 2015-01-10 03:06:58
380 | 15 | Boston | JavaScript | 2015-01-10 02:06:58
379 | 14 | San Francisco | C++ | 2015-01-10 01:06:58
我正在尝试获取最近 10 分钟内更新的最后记录数据,然后按 user_id 对它们进行分组。我正在使用的查询是:
$date = new DateTime;
$date->modify('-10 minutes');
$formatted_date = $date->format('Y-m-d H:i:s');
$activeusers = DB::table('active_user_data')->where('updated_at','>=',$formatted_date)
->select(DB::raw('*,max(id) as id'))
->orderBy('updated_at', 'DESC')
->groupby('user_id')
->get();
但是查询为 ID 为 13 的用户获取的数据库记录如下:
383 | 13 | New York | RUBY | 2015-01-10 03:06:58
我想获取每个数据列的最新更新记录,这样不仅 MAX ID 是正确的,而且每个组的所有列 都包含具有最新 ID 值的数据。
383 | 13 | New York | PHP | 2015-01-10 05:06:58
我怎样才能做到这一点?
在原始 Mysql 查询中,您需要一个自连接来获取每个 user_id
的最新行
select a.*
from active_user_data a
join (select max(id) id ,user_id
from active_user_data
group by user_id) b
on(a.id = b.id and a.user_id = b.user_id)
使用 Laravel 的查询生成器,我想这个就可以了
DB::table('active_user_data as a')
->select(DB::raw('a.*'))
->join(DB::raw('(SELECT max(id) id ,user_id FROM active_user_data GROUP BY user_id ) AS b'), function($join)
{
$join->on('a.id', '=', 'b.id');
$join->on('a.user_id', '=', 'b.user_id ');
})->get();
我有一个包含多条记录的数据库,如下所示:
Id | user_id | city | users_language | updated_at |
_____________________________________________________________________
383 | 13 | New York | PHP | 2015-01-10 05:06:58
382 | 13 | New York | JAVA | 2015-01-10 04:06:58
381 | 13 | New York | RUBY | 2015-01-10 03:06:58
380 | 15 | Boston | JavaScript | 2015-01-10 02:06:58
379 | 14 | San Francisco | C++ | 2015-01-10 01:06:58
我正在尝试获取最近 10 分钟内更新的最后记录数据,然后按 user_id 对它们进行分组。我正在使用的查询是:
$date = new DateTime;
$date->modify('-10 minutes');
$formatted_date = $date->format('Y-m-d H:i:s');
$activeusers = DB::table('active_user_data')->where('updated_at','>=',$formatted_date)
->select(DB::raw('*,max(id) as id'))
->orderBy('updated_at', 'DESC')
->groupby('user_id')
->get();
但是查询为 ID 为 13 的用户获取的数据库记录如下:
383 | 13 | New York | RUBY | 2015-01-10 03:06:58
我想获取每个数据列的最新更新记录,这样不仅 MAX ID 是正确的,而且每个组的所有列 都包含具有最新 ID 值的数据。
383 | 13 | New York | PHP | 2015-01-10 05:06:58
我怎样才能做到这一点?
在原始 Mysql 查询中,您需要一个自连接来获取每个 user_id
的最新行select a.*
from active_user_data a
join (select max(id) id ,user_id
from active_user_data
group by user_id) b
on(a.id = b.id and a.user_id = b.user_id)
使用 Laravel 的查询生成器,我想这个就可以了
DB::table('active_user_data as a')
->select(DB::raw('a.*'))
->join(DB::raw('(SELECT max(id) id ,user_id FROM active_user_data GROUP BY user_id ) AS b'), function($join)
{
$join->on('a.id', '=', 'b.id');
$join->on('a.user_id', '=', 'b.user_id ');
})->get();