在 Laravel 中进行复杂查询的 orderBy 之后的 GroupBy
Posted
技术标签:
【中文标题】在 Laravel 中进行复杂查询的 orderBy 之后的 GroupBy【英文标题】:GroupBy after orderBy for complicated query in Laravel 【发布时间】:2016-12-27 10:00:16 【问题描述】:这是我为每个聊天获取消息并将它们分组的代码
$query = DB::table('chats');
$otherUserId= $request->input('loadId');
if($otherUserId==0)
$query->join('users as u1', 'u1.id', '=', 'chats.user1_id');
$query->join('users as u2', 'u2.id', '=', 'chats.user2_id');
$query->join('messages', 'messages.chat_id', '=', 'chats.id');
$query->where('chats.user1_id', '=', '$userId');
$query->orWhere('chats.user2_id', '=', '$userId');
$query->select('messages.chat_id', 'messages.from_id', 'u1.id as user1_id', 'u2.id as user2_id', 'messages.created_at', 'messages.body', 'messages.read', 'u1.name as user1_name', 'u2.name as user2_name', 'u1.picture_url as user1_pic', 'u2.picture_url as user2_pic');
$query->orderBy('messages.created_at ', 'DESC');
$query->groupBy('chat_id');
$messages = $query->paginate(4);
当我运行查询时,结果并不像预期的那样,OrderBy 出现在 group by 之后。我已经尝试了很多,但找不到和解决方案。我也尝试了这个解决方案,但无法使其工作。 Order By before Group By using Eloquent (Laravel)
请帮帮我,我已经浪费了很多时间来解决这个问题。提前感谢您帮助我。
【问题讨论】:
【参考方案1】:分页前一行添加以下代码
dd($query->toSql());
这将返回查询字符串以调试 mysql 查询。 如果您仍然无法找出发生了什么,请将其粘贴到此处以帮助您。
【讨论】:
【参考方案2】:这是因为将 GROUP BY
子句放在 ORDER BY
之后是不合法的语法 - 请注意文档中的正式定义。
http://dev.mysql.com/doc/refman/5.7/en/select.html
目前尚不清楚您实际上想通过此实现什么 - SQL 对聚合内的有序数据没有特别好的支持。
【讨论】:
感谢@Sam Dufel,我不知道 Group by 在 order By 之后是不合法的。但是我需要做的是获取每个聊天的 1 条最新消息(有很多消息与一个聊天相关),你能建议任何解决方案吗?再次感谢您的帮助。【参考方案3】:感谢大家帮助我。 最后我解决了它,我从另一个帖子https://***.com/a/7745635/6279602 的这个答案中得到了帮助,它适用于连接而不是 group by,因为 group by 不支持排序。
【讨论】:
以上是关于在 Laravel 中进行复杂查询的 orderBy 之后的 GroupBy的主要内容,如果未能解决你的问题,请参考以下文章
使用 Laravel Query Builder 进行复杂的 MySQL 内连接查询
如何使用 laravel Query Builder 进行复杂查询