如何分组该组的最新记录

时间:2016-11-03 01:08:23

标签: php mysql laravel laravel-5 laravel-5.2

我将使用哪种laravel查询groupBy(' author_id'),但最新结果。现在,我尝试的所有内容都会提取第一个结果。我已经尝试使用MAX(id)作为id sql函数,但没有运气

它找到记录正常,只找到组中的第一条记录

这是我正在使用的模型查询:

public function lastMessages() {
     return $this->hasMany('App\Message', 'recipient_id')->groupBy('author_id')->orderBy('created_at', 'DESC');
}

我也尝试过:

public function lastMessages() {
     return $this->hasMany('App\Message', 'recipient_id')
         ->select(DB::raw('*, max(id) as id))
         ->groupBy('author_id')
         ->orderBy('id', 'desc');
}

我也试过这个,没有运气:

public function lastMessages() {
     return $this->hasMany('App\Message', 'recipient_id')
         ->select(DB::raw('*, max(created_at) as created_at))
         ->groupBy('author_id')
         ->orderBy('created_at', 'desc');
}

以上所有内容都将返回组author_id的第一行。我想要返回每组或最后一行的最后一行。我也试过 - > latest()而且没有骰子!

提前感谢您的帮助。

我的表:

ID PROJECT_ID AUTHOR_ID recipient_id 信息 created_at 的updated_at

3 个答案:

答案 0 :(得分:1)

创建一个子查询连接,以这种方式获取每个作者的最新消息ID group by将不再需要,因为您已经在连接子查询中获取每个作者的最新消息ID

不再需要

max(created),因为您已经在每个组中获取最新创建的消息

public function lastMessages() {
    return $this->hasMany('App\Message', 'recipient_id')
         ->select('*')
         ->join(DB::raw('(Select max(id) as id from messages group by author_id) LatestMessage'), function($join) {
            $join->on('messages.id', '=', 'LatestMessage.id');
            })
         ->orderBy('created_at', 'desc');
}

Screen Shot

答案 1 :(得分:1)

在这个问题上敲了几个小时并从这个论坛得到一些意见后,我得到了这个,这也为我提供了理想的结果。

public function lastMessages() {
    return $this->hasMany('App\Message', 'recipient_id')
        ->select('*')
        ->whereIn('id', function($q){
            $q->select(DB::raw('MAX(id) FROM messages GROUP BY author_id'));
        });
}

答案 2 :(得分:0)

要按最新记录分组,您可以使用最新且独特的方法,如下所示:

public function lastMessages() {
 return $this->hasMany('App\Message', 'recipient_id')->latest()->get()->unique('author_id');
}