如何从每个用户获取最后一行?

时间:2016-02-25 11:54:35

标签: mysql

即时消息系统就像facebook消息部分一样。我想在哪里显示用户和他的朋友之间的对话列表。 我的聊天表的字段是

id,user1(varchar),user2(varchar),message,created_at(timestamp),updated_at(timestamp)

使用查询检索某个对话

SELECT message FROM chat WHERE user1 IN ('"+user1+"','"+user2+"') AND user2 IN ('"+user1+"','"+user2+"')

但是现在我无法检索邮件的最新(最近插入的)行,另一个用户(接收我们的邮件的那个)和发送的时间。这将由列表显示(就像Facebook会话列表)。 这意味着我想要聊天桌上每个用户的最新消息列表(一个)。或者如果我和你聊天,我想收到你的名字和信息。

我想出了一个查询,我希望你能看到它不是我想要的最终答案,但它非常接近它。

SELECT sent_at,message,user1,user2 FROM (SELECT max(created_at) AS 
sent_at,message,user1,user2 FROM chats WHERE user1='Tiffany' OR 
user2='Tiffany' Group By user1, user2 Having max(created_at)) tb1 

它返回用户“Tiffany”的最后一个对话。已经完成,这意味着蒂芙尼发送和接收的最新消息。现在我想收到蒂芙尼收到或发送的最新对话。

4 个答案:

答案 0 :(得分:1)

SELECT message FROM chat WHERE user1 IN('" + user1 +"','" + user2 +"' )AND user2 IN('" + user1 +"''" + user2 +"')按消息desc限制排序1;

答案 1 :(得分:1)

我认为这会起作用

ToList()

答案 2 :(得分:1)

如果我正确理解了您的问题,那么您要查找的是会员联系人列表中每个联系人的最新消息(一个)列表?

因此,您需要从数据库中为每个对应方抓取一条消息,并且您获取的消息需要是最新的。

这两个标准现在意味着您/我们可以将逻辑应用于SQL以实现此结果。

因此;

使用您提供的SQL表格列格式:

  

ID,用户1(VARCHAR),用户2(VARCHAR),消息的updated_at(时间戳),的updated_at(时间戳)

假设您要列出其邮件的成员位于user1列中,我们可以构建:

SELECT message, FROM_UNIXTIME(MAX(updated_at)) AS chat_time 
FROM chat WHERE user1 = :username ORDER BY updated_at GROUP BY user2 

因此,user2的foreach值SQL列出了最大时间戳值,这是该用户的最新消息。

我想要做的是,如果用户在 user1user2GROUP BY相对列中有特色,那么如果用户在user1然后按用户2分组,反之亦然,但我现在不能轻易做到这一点,可能会涉及HAVING我没有和我一样多的经验39;喜欢。

可能UNION会这样做,但我想在这里找到一个更简洁的解决方案:

    SELECT message, FROM_UNIXTIME(MAX(updated_at)) AS chat_time 
    FROM chat WHERE user1 = :username ORDER BY updated_at GROUP BY user2 
UNION
    SELECT message, FROM_UNIXTIME(MAX(updated_at)) AS chat_time 
    FROM chat WHERE user2 = :username ORDER BY updated_at GROUP BY user1 

答案 3 :(得分:1)

我得到了我想要使用MAX()来获得正确的对话。

SELECT sent_at,
       message,
       user1,
       user2
FROM 
   (SELECT max(created_at) AS sent_at,
          message,
          user1,
          user2 
   FROM `chats` 
   WHERE user1='Tiffany' 
   OR user2='Tiffany' 
   Group By user1,
         user2
   Having max(created_at))tb1