如何从每次对话中获取最后一条消息

时间:2016-05-25 10:20:09

标签: mysql sql

我有消息系统,我想从每个对话中获取最后一条消息,所以我可以在消息通知面板中显示它,我有两个表 convo id是独一无二的。用户名

也是如此
convo_id|from_user | to_user   |  updated
========================================
    1   |  user1   |    user6  |  1463311906
    2   |  user2   |  user7    |  1463311906
    3   |   user8  |   user1   |  1463311906
    4   |   user4  |   user9   |  1463311906
    5   |  user5   |   user10  |  1463311906

这是聊天表,它存储所有消息*消息的详细信息

    id |convo_id|from_user | to_user   |  updated    | message
    =========================================================
    1  |    1   |  user1  |   user6    |  1463311906 | hello
    2  |    2   |  user1  |   user6    |  1463311906 | hi
    3  |    3   |  user1  |   user6    |  1463311906 | howdy
    4  |    3   |  user8  |   user1    |  1463311906 | great
    5  |    2   |  user8  |   user1  |  1463311906   | good

现在我想要的只是得到每个对话的最后一条消息,例如 我的用户名是“user1”,我有消息“user6”所以在聊天表中,你可以看到我已经三次发送消息user6所以我想从这三条消息中获取最后一条消息

正如你在对话表中看到的那样,user8有两次消息user1是我,所以我也希望得到最后一条消息。 我怎么能做到这一点?

这是我尝试过的事情

SELECT 
    *
FROM
    test_convo
WHERE
    to_user = 'user1'
        OR from_user = 'user1'

这是我从convo表中得到的结果

'1', 'user1', 'user6', '1463311906', '0'
'2', 'user8', 'user1', '1463311906', '0'

当我使用while循环时,如何从聊天表

获取每个会话的最后一条消息

3 个答案:

答案 0 :(得分:1)

请使用可能这可以帮助您:

SELECT max(YOURID),TABLENAME.* 
FROM TABLENAME
GROUP BY yourid

答案 1 :(得分:1)

您找到每个会话ID的最大ID,这是最后一条消息,然后将该派生表与聊天表一起加入以获取消息和任何其他信息:

  select c.maxid as chatID,d.from_user,d.to_user,c.convo_id,d.message 
  from tblchat d 
  inner join  (select max(b.id) as maxID,b.convo_id  
  from tblconv a 
  inner join tblchat b 
  on a.convo_id=b.convo_id 
  group by b.convo_id) c 
  on c.maxID=d.id

答案 2 :(得分:1)

你可以使用“IN”功能这里id是自动增量所以默认你会得到最大id。

SELECT * 
FROM test_convo tc 
where tc.id in ( select last(tc1.id) 
    from      test_convo tc1 
    where tc1.to_user = 'user1') or tc.id in 
         (  select last(tc2.id)   
            from test_convo tc2 
            where tc2.from_user =  'user1');  

否则,如果您使用MYSQL,则可以使用限制

SELECT * 
FROM test_convo tc 
where tc.id in ( select last(tc1.id) 
    from      test_convo tc1 
    where tc1.to_user = 'user1' order by id desc limit 1) or tc.id in 
         (  select last(tc2.id)   
            from test_convo tc2 
            where tc2.from_user =  'user1' order by id desc limit 1);