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)

DEMO

使用 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();