繁体   English   中英

消息收件箱mysql按发件人或收件人分组

[英]message inbox mysql group by sender or recipient

我有一个留言表

message_idsender_idrecipient_idsubjectmessagereadsender_deletedrecipient_deletedupdated_atcreated_at

sender_id Android一样创建和收件箱,所以我只需要显示按recipient_id sender_idsender_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会正确显示。这就像我必须再次给出正确的message_id进行查询才能获取适当的数据行吗? 消息ID如何正确但其他数据显示不正确?

谢谢!

这是基于条件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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM