我有一个消息表
message_id
,sender_id
,recipient_id
,subject
,message
,read
,sender_deleted
,recipient_deleted
,updated_at
,created_at
我想像Android一样创建和收件箱,所以我只需显示按recipient_id
OR sender_id
分组的最新消息(即如果最后一条消息是我发送的,则需要分组由收件人显示他们的详细信息),而不是将我发送给任何用户的每条消息分组。
我正在使用Laravel
并提出以下内容:
$messages = DB::table('cf_messages')
->select(DB::raw('*, max(message_id) as message_id'))
->where('sender_id', '=', $user->id)
->where('sender_deleted', '=', false)
->orWhere('recipient_id', '=', $user->id)
->where('recipient_deleted', '=', false)
->groupBy(DB::raw('if (sender_id = '.$user->id.', recipient_id, sender_id)'))
->orderBy('message_id', 'desc')
->get();
这似乎是正确获取和分组行,但是我可以让某人确认这一点吗?
我遇到的这个问题虽然如果我转储结果message_id
正确,我会得到错误的主题,消息等等...这就像我必须再次进行查询,给出正确的{{} 1}}获取适当的数据行?消息ID如何正确但其他数据显示不正确?
谢谢!
答案 0 :(得分:0)
这是基于group by
条件的典型SQL行为。
由于您要将多行信息压缩在一起,因此SQL会在其他未归类的列中返回随机信息,或者不会对其进行任何聚合。
您的解决方案是在同一个表上进行内部联接以接收正确的消息信息,如下所示:
$messages = DB::table('cf_messages')
->select(DB::raw('cf_messages.sender_id,cf_messages.recipient_id, cfm.subject, cfm.message, cfm.read, max(cf_messages.message_id) as message_id'))
->join('cf_messages as cfm','max_message_id','=','cfm.message_id')
->where('cf_messages.sender_id', '=', $user->id)
->where('cf_messages.sender_deleted', '=', false)
->orWhere('cf_messages.recipient_id', '=', $user->id)
->where('cf_messages.recipient_deleted', '=', false)
->groupBy(DB::raw('if (cf_messages.sender_id = '.$user->id.', cf_messages.recipient_id, cf_messages.sender_id)'))
->orderBy('max_message_id', 'desc')
->get();