【问题标题】:select last message of conversation for each conversation in mysql为mysql中的每个对话选择对话的最后一条消息
【发布时间】:2014-03-28 08:09:26
【问题描述】:

我的查询:

SELECT *
  FROM messages_status mst
       INNER JOIN messages msg 
             ON mst.msg_id=msg.id
 WHERE mst.user_id = 1 
       AND mst.status NOT IN (0,3)
ORDER BY 
       msg.created_at DESC

将出现在这个 sqlfiddle 中: http://sqlfiddle.com/#!2/be010/1/0

你有 2 个表:messages 和 message_status 首先包含消息数据,如内容、发件人 ID、创建时间和对话 ID。 第二个有特定的用户消息状态,是已读还是已删除。

我想获取每个对话的最后一条消息

有什么想法吗?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    看看这个:

    SELECT *
      FROM messages_status mst
           INNER JOIN (SELECT messages.* FROM messages INNER JOIN (
                        SELECT sender_ID,conv_id,MAX(created_at) as maxtime FROM messages
                        GROUP BY sender_ID,conv_id) as t1 ON
                        t1.sender_id = messages.sender_id AND t1.conv_id = messages.conv_id AND 
                        t1.maxtime = messages.created_at) msg 
                        ON mst.msg_id=msg.id
    WHERE mst.user_id = 1 AND mst.status NOT IN (0,3)
    ORDER BY msg.created_at DESC
    

    这是link

    【讨论】:

    • 谢谢!但是知道为什么我每次转化得到 2 行而不是 1 行吗?
    【解决方案2】:

    按照您的要求获取每个对话的最后一条消息 你可以试试这个

    select *
    from messages msg
    inner join
    (
      select max(created_at) created_at
      from messages
      group by conv_id
    ) m2
      on msg.created_at = m2.created_at
    
    Inner JOIN messages_status mst ON msg.id=mst.msg_id 
    WHERE mst.user_id = 1 AND mst.status NOT IN (0,3)
    

    http://sqlfiddle.com/#!2/be010/89

    【讨论】:

      【解决方案3】:

      SQLFIDDLEExample

      查询:

      SELECT msg.*
      FROM messages_status mst
      INNER JOIN messages msg ON mst.msg_id=msg.id
      LEFT JOIN messages ms2
       ON ms2.conv_id = msg.conv_id
       AND ms2.created_at > msg.created_at
      WHERE mst.user_id = 1 
       AND mst.status NOT IN (0,3)
       AND ms2.created_at is null
      

      结果:

      | ID | SENDER_ID | CONV_ID |       CONTENT |                   CREATED_AT |                   UPDATED_AT |
      |----|-----------|---------|---------------|------------------------------|------------------------------|
      | 16 |         3 |       3 |         hy :) | March, 26 2014 16:38:17+0000 | March, 26 2014 16:38:17+0000 |
      | 14 |         1 |       1 | kjhkjhkjh  kl | March, 26 2014 16:16:25+0000 | March, 26 2014 16:16:25+0000 |
      

      【讨论】:

      • 唯一不涉及第二次查询的解决方案。像魅力一样工作。
      【解决方案4】:

      这是小提琴。 http://sqlfiddle.com/#!2/be010/116

      这是您最常使用的查询:

      SELECT *
      FROM 
      (SELECT messages.id as id, 
      messages.conv_id as conv_id,
      max(messages.created_at) as created_at FROM messages,messages_status
      WHERE messages.id = messages_status.msg_id
      AND messages_status.user_id = 1 
      AND messages_status.status NOT IN (0,3)
      GROUP BY messages.conv_id) max_created
      INNER JOIN messages 
      ON messages.created_at = max_created.created_at
      INNER JOIN  messages_status mst 
      ON mst.msg_id=max_created.id
      GROUP BY messages.conv_id
      ORDER BY max_created.created_at DESC;
      

      【讨论】:

      • 谢谢,但正如您在结果中看到的那样,您只收到一条对话消息,有 2 个对话
      • 好的.. 弄清楚我做错了什么。编辑了上面的查询和小提琴。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-25
      • 2018-11-15
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多