我将使用哪种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
答案 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');
}
答案 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');
}