Laravel Group By查询不是从每个组中选择最高记录

时间:2015-01-05 05:35:41

标签: mysql laravel-4 group-by

我有一个包含多条记录的数据库,如下所示:

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

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

在原始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的querybuilder,我猜这个将完成这项工作

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