在 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 byorder By 之后是不合法的。但是我需要做的是获取每个聊天的 1 条最新消息(有很多消息与一个聊天相关),你能建议任何解决方案吗?再次感谢您的帮助。【参考方案3】:

感谢大家帮助我。 最后我解决了它,我从另一个帖子https://***.com/a/7745635/6279602 的这个答案中得到了帮助,它适用于连接而不是 group by,因为 group by 不支持排序。

【讨论】:

以上是关于在 Laravel 中进行复杂查询的 orderBy 之后的 GroupBy的主要内容,如果未能解决你的问题,请参考以下文章

使用 Laravel Query Builder 进行复杂的 MySQL 内连接查询

如何使用 laravel Query Builder 进行复杂查询

复杂的查询操作

复杂的 SQL / Laravel Eloquent 查询

在 Laravel 中使用 Eloquent 进行更高级的数据库查询

如何在 laravel 中执行复杂的 mysql 查询