Php MySQL中的Messages表,获取每个线程的最后一条消息
我试图从每次对话中获取最后一条消息,唯一的问题是我没有使用对话表 我使用的是一个messages表,我的表列如下所示:Php MySQL中的Messages表,获取每个线程的最后一条消息,php,mysql,laravel,Php,Mysql,Laravel,我试图从每次对话中获取最后一条消息,唯一的问题是我没有使用对话表 我使用的是一个messages表,我的表列如下所示: id from_id to_id text isread isseen created_at updated_at $messages = Message::select('*')-> from(DB::raw("(select * from `messages` where `to_id` = ".Auth:
id from_id to_id text isread isseen created_at updated_at
$messages = Message::select('*')->
from(DB::raw("(select * from `messages` where `to_id` = ".Auth::id()." order by `created_at` desc) as sub"))->
groupBy('from_id')->orderBy('created_at', 'desc')->
paginate(7);
SELECT from_id, MAX(created_at) AS last FROM messages GROUP BY from_id
现在,我可以检索如下对话:
id from_id to_id text isread isseen created_at updated_at
$messages = Message::select('*')->
from(DB::raw("(select * from `messages` where `to_id` = ".Auth::id()." order by `created_at` desc) as sub"))->
groupBy('from_id')->orderBy('created_at', 'desc')->
paginate(7);
SELECT from_id, MAX(created_at) AS last FROM messages GROUP BY from_id
唯一的缺点是,我没有检索每次对话的最后一条消息,而是检索收到的最后一条消息
如何检索每次对话的最后一条消息
示例检索user63对话和每个对话的最后一条消息:
id from_id to_id text isread isseen created_at updated_at
23 224 63 a 0 0 2015-03-28 22:23:54 2015-03-28 22:23:54
20 63 225 b 0 0 2015-03-28 22:23:06 2015-03-28 22:23:06
16 225 63 hi 0 1 2015-03-28 22:21:32 2015-03-28 22:21:32
我想到了一个主意,但不确定:
$messages = Message::select('*')->
from(DB::raw("
(
(select *, to_id as theuser from `messages` where `to_id` = ".Auth::id()." order by `created_at` desc)
union
(select *, from_id as theuser from `messages` where `from_id` = ".Auth::id()." order by `created_at` desc) group by theuser
) as sub"))->
groupBy('from_id')->orderBy('created_at', 'desc')->
paginate(7);
我自己找到了解决办法,谢谢大家!:) 这也必须起作用: 这种方法的不同之处在于,在max()函数的帮助下实现了自连接,如下所示:
id from_id to_id text isread isseen created_at updated_at
$messages = Message::select('*')->
from(DB::raw("(select * from `messages` where `to_id` = ".Auth::id()." order by `created_at` desc) as sub"))->
groupBy('from_id')->orderBy('created_at', 'desc')->
paginate(7);
SELECT from_id, MAX(created_at) AS last FROM messages GROUP BY from_id
因此:
用
from\u id
添加一个约束?您的意思是指向何处的\u id或来自何处的\u id?我将获得重复的线程。其中来自\u id
这是基于对话的假设,你指的是两个人之间的信息。是的,这只是两个人,但是,我又将如何拥有独特的线程……考虑这个例子:从Fuffid ID 50到ID 60,从Fuffid ID 60到50 ID,如果你不知道大约60,你将如何得到最后一条消息,你得到了50的THE。如果这是一个会话线程,你必须了解双方……除非我漏掉了别的东西。这个代码是完全不可读的,我建议你多注意编码风格,谢谢,我编辑了代码,请考虑投票: