mysql - 如何使用 laravel 通过查询将 2 个表与组连接

标签 mysql laravel-5

我的数据库中有一个用户和聊天表。以下是我的表中的一些示例数据:

用户表:

id  |   name  |    avatar
1       john     default.png
2       mark       picture.jpg

聊天表:

   id  |   user_id  |  friend_id | message | status
    1        1           2           hello     0
    2        1           2           hi        1

状态栏的目的是判断消息是否已经被阅读。

  status 0 = unread message
  status 1 = read message

这是我对所有未读消息进行分组和计数的代码:

        $chat = DB::table('chats')
             ->join('users', 'users.id', '=', 'chats.user_id')
             ->select('user_id', DB::raw('count(*) as total'))
             ->where('friend_id', Auth::user()->id)
             ->where('status',0)
             ->groupBy('user_id')
             ->get();

这是我尝试插入用户头像时的代码,但出现此错误:users.avatar' isn't in GROUP BY

        $chat = DB::table('chats')
             ->join('users', 'users.id', '=', 'chats.user_id')
             ->select('users.avatar','user_id', DB::raw('count(*) as total'))
             ->where('admin_id', Auth::user()->id)
             ->where('status',2)
             ->groupBy('user_id')
             ->get();

我想要的是还获得发送消息的用户的头像。我不知道如何构建查询以获取头像列。任何帮助,将不胜感激。谢谢。

最佳答案

如果您GROUP BY users 表中的id,您应该能够选择users 中的任何其他列 表也是:

$chat = DB::table('chats')
         ->join('users', 'users.id', '=', 'chats.user_id')
         ->select('users.id', 'users.avatar', DB::raw('COUNT(*) AS total'))
         ->where('friend_id', Auth::user()->id)
         ->where('status',0)
         ->groupBy('users.id')
         ->get();

乍一看,这似乎违反了 GROUP BY 的规则,该规则声明不能选择非聚合列。但这是允许的,因为用户 id 在功能上决定了其他列的值。换句话说,如果我们选择一个用户 id,我们就确切地知道他的头像值必须是什么。

如果上面给你一个错误,你可以试试这个GROUP BY:

->groupBy('users.id', 'users.avatar')

关于mysql - 如何使用 laravel 通过查询将 2 个表与组连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48537553/

相关文章:

javascript - 无法在 Laravel 5 中显示 Google map

php - 如何从 Eloquent 关系中限制选定的列?

PHP - 根据另一个页面的回显结果从数据库捕获用户名

mysql - 在 MySQL 数据库中存储具有与另一个表相关的 id 的数组的最佳方法是什么?

mysql - 数据库表创建——分割年龄组

php - 在 Laravel 中从数据库中检索和显示单个记录

javascript - 如何使用jquery为每个点击的链接弹出一个新的浏览器窗口

mysql - 从多个表中删除

mysql - 如何对 MySQL 中的列求和

php - 使用 DB::select 执行查询的 Laravel 5 问题