我有一个包含多条记录的数据库,如下所示:
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
我怎样才能做到这一点?
答案 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)
使用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();