Mysql 使用QueryBuilder按联接表中的最大值和计数对结果进行分组和排序

Mysql 使用QueryBuilder按联接表中的最大值和计数对结果进行分组和排序,mysql,laravel,group-by,laravel-5,eloquent,Mysql,Laravel,Group By,Laravel 5,Eloquent,我正在制作一个卖书的应用程序,但我正在努力解决这部分问题 当用户想要买一本书时,他可以向书的销售者发送一条消息。我有一个名为conversations的表和另一个名为messages的表,其中保存了会话的消息 我有一个页面,用户可以看到他参与的对话列表。应首先显示最新消息的对话。我已经解决了这个问题,但是我还想在每个对话旁边显示未读消息的数量(消息有一个“read”布尔字段)。我无法将计数添加为原始查询的一部分;我知道我可以对conversations集合中的每个项目进行查询,但这将是非常低效的

我正在制作一个卖书的应用程序,但我正在努力解决这部分问题

当用户想要买一本书时,他可以向书的销售者发送一条消息。我有一个名为conversations的表和另一个名为messages的表,其中保存了会话的消息

我有一个页面,用户可以看到他参与的对话列表。应首先显示最新消息的对话。我已经解决了这个问题,但是我还想在每个对话旁边显示未读消息的数量(消息有一个“read”布尔字段)。我无法将计数添加为原始查询的一部分;我知道我可以对conversations集合中的每个项目进行查询,但这将是非常低效的

这是我到目前为止对QueryBuilder的查询:

$conversations = DB::table('conversations')
            ->select([
                'books.title as bookTitle', 'conversations.id',
                 DB::raw('max(messages.created_at) as lastMessage'),
                // DB::raw('(select count(id) from messages')
            ])
            ->where('conversations.from_user', $this->user->id)
            ->orWhere('conversations.to_user', $this->user->id)
            ->join('books', 'conversations.book_id', '=', 'books.id')
            ->join('messages', 'conversations.id', '=', 'messages.conversation_id')
            ->groupBy('messages.conversation_id')
            ->orderBy('lastMessage', 'DESC')
            ->get();
如果我添加注释掉的部分以尝试获取一个包含该对话未读消息数的字段,则会出现SQL语法错误。我还一直在想,是否可能无法添加count字段,因为它可能是我原始查询的专有字段:我将所有消息(已读或未读)都考虑在内,对对话进行排序,并为每个对话选择最新的消息;我想添加的count字段应该只计算未读邮件的数量

有什么想法吗?希望我能解释清楚


谢谢。

似乎不是:

DB::raw('(select count(id) from messages')
您只需使用:

DB::raw('(select count(id) from messages) as messageCount')

您在这里丢失了

要执行的SQL是什么?