Php 如何按组上的最新记录分组

Php 如何按组上的最新记录分组,php,mysql,laravel,laravel-5,laravel-5.2,Php,Mysql,Laravel,Laravel 5,Laravel 5.2,除了最新的结果之外,我将使用什么样的laravel查询来查询groupBy('author_id')。现在我所做的一切都会带来第一个结果。我曾尝试使用MAX(id)作为id-sql函数,但没有成功 它找到记录ok,只找到组中的第一条记录 以下是我正在使用的模型查询: public function lastMessages() { return $this->hasMany('App\Message', 'recipient_id')->groupBy('author_id

除了最新的结果之外,我将使用什么样的laravel查询来查询groupBy('author_id')。现在我所做的一切都会带来第一个结果。我曾尝试使用MAX(id)作为id-sql函数,但没有成功

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

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

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');
}
以上所有操作都将返回组作者id的第一行。我希望返回每个组的最后一行或最新一行。我也尝试了->latest()和no dice

提前谢谢你的帮助

我的桌子:

身份证 项目编号 作者id 收件人id 消息 创建于
更新的\u at

创建一个子查询联接,以获取每个作者的最新邮件id。由于您已在联接子查询中获取每个作者的最新邮件id,因此不再需要group by

不再需要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');
}

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

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'));
        });
}

要按最新记录分组,可以使用以下最新和唯一的方法:

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

如果您显示一些示例数据以及所需的输出,可能会有所帮助。OMG!!谢谢你,在过去的4个小时里,我一直在为这件事绞尽脑汁。我找到了另一个解决方案,没有使用连接。我也会发布答案是的,但是这一个比较慢,因为你在每一行中都调用这个子查询。你测量了查询的速度吗?说到sqlJust prepend,我不是最棒的,在你提问之前解释一下,在laravel中你会怎么做?通过DB::Raw或是否有explain->()命令手动将
explain查询
输入到您的dbms