【问题标题】:Messages table in MySQL, getting last message for each threadMySQL中的消息表,获取每个线程的最后一条消息
【发布时间】:2015-03-28 19:06:45
【问题描述】:

我正在尝试从每个对话中获取最后一条消息,唯一的问题是我没有使用对话表。

我正在使用一个消息表,我的表列如下所示:

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);

唯一的缺点是我不是检索每个对话的最后一条消息,而是检索收到的最后一条消息。

如何检索每个对话的最后一条消息?

示例检索 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);

【问题讨论】:

  • 使用from_id添加约束?
  • 你的意思是哪里 to_id 或哪里 from_id?我会收到重复的线程。
  • from_id 的位置(这是基于通过对话假设您是指两个人之间的消息。
  • 是的,这只是两个人,但是,我将如何拥有独特的线程......例如考虑这个:from_id 50 到 id 60,和 from_id 60 to_id 50 你将如何获得最后一条消息对于该线程,假设您不知道 60 个,那么您将获得 50 个线程。
  • 如果它是一个对话线程,你必须了解双方......除非我错过了其他东西。

标签: php mysql laravel


【解决方案1】:

这也必须有效: 这种方法的不同之处在于在 max() 函数的帮助下进行自连接,如下所示:

SELECT from_id, MAX(created_at) AS last FROM messages GROUP BY from_id

所以:

$pagedMessages = Message::select('*')->
  from(
    DB::raw("
        messages AS m 
        JOIN (
            SELECT from_id, MAX(created_at) AS lm FROM messages GROUP BY from_id
        ) AS lm 
        ON lm.from_id = m.from_id AND lm.created_at = m.created_at 
    "))->
paginate(7);

【讨论】:

    【解决方案2】:

    我自己找到了解决办法,谢谢大家! :)

    $messages = Message::select('*')->
    from(DB::raw("
        ( 
          SELECT *,`from_id` as `theuser`
          FROM `messages` WHERE `to_id` = 63
          union
          SELECT *,`to_id` as `theuser`
          FROM `messages` WHERE `from_id` = 63
          order by `created_at` desc
        ) as `sub`"))->groupBy('theuser')->
                       orderBy('created_at', 'desc')->
                       paginate(7);
    

    【讨论】:

    猜你喜欢
    • 2015-09-17
    • 2017-05-24
    • 2019-12-26
    • 2017-09-21
    • 2018-07-28
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多