我的数据库中有一个用户和聊天表。以下是我的表中的一些示例数据:
用户表:
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/